pip install pywin32
import win32gui
#win32gui和win32api有大量函数是重复的,也就是说既能通过gui来调用,也能通过api来调用,比如下面的FindWindow(),FindWindowEx(),GetWindowText(),GetWindowRect(),GetCursorPos()函数
def GetXY(): #获得模拟器的窗口位置
hwnd=win32gui.FindWindow('Qt5QWindowIcon','夜神模拟器')#是文件句柄,通过使用visual studio自带的spy++获得的。在工具栏中的 工具->spy++中,Qt5QWindowIcon是窗口类名,夜神模拟器 是窗口标题(窗口标题不一定是你窗口左上角显示的标题)
print(hwnd)
#可操作窗口一般不是主窗口,一般是子窗口,子窗口必须使用FindWindowEx()函数来进行搜索
hwnd = win32gui.FindWindowEx(hwnd, 0, 'Qt5QWindowIcon', 'ScreenBoardClassWindow');#在窗口句柄为hwnd的窗口中,(本例是 夜神模拟器),寻找子窗口,同样是在spy++工具中看到的窗口信息。Qt5QWindowIcon是窗口类名,ScreenBoardClassWindow是窗口标题
hwnd = win32gui.FindWindowEx(hwnd, 0, 'Qt5QWindowIcon', 'QWidgetClassWindow');#在窗口句柄为hwnd的窗口中,(本例是 ScreenBoardClassWindow),寻找子窗口,同样是在spy++工具中看到的窗口信息。Qt5QWindowIcon是窗口类名,ScreenBoardClassWindow是窗口标题
print('hwnd=',hwnd)
text = win32gui.GetWindowText(hwnd) #返回的是窗口的名字(不一定是窗口左上角显示的名字)
left, top, right, bottom = win32gui.GetWindowRect(hwnd) #(left,top)是左上角的坐标,(right,bottom)是右下角的坐标
#win32gui.SetForegroundWindow(hwnd)
return (left,top,hwnd) #返回模拟器的左上角(x,y)坐标(即left,top),以及模拟器窗口的句柄
#mouseX, mouseY = win32gui.GetCursorPos() # 返回当前鼠标位置,注意坐标系统中左上方是(0, 0)
#print('mouseX=',mouseX,'mouseY=',mouseY)
import win32gui
import win32api
import random
import time
import win32con
def MoveAndClick(left, top, hwnd):#鼠标在目标窗口上的点击操作函数(点击的位置进行了随机,点击间隔时间也进行了随机)
click_x = left + 460#点击点的X坐标
click_y = top + 540#点击点的Y坐标
#print('click_x=',click_x,'click_y=',click_y) #检查点击点的坐标
random_deltax = (random.random() - 0.5) * 15#在点击点的附近,x坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
random_deltay = (random.random() - 0.5) * 15#在点击点的附近,y坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
click_pos =win32gui.ScreenToClient(hwnd,(click_x,click_y))#将点击点左边变成需要点击的界面上的坐标(这一步必须要有!)
tmp = win32api.MAKELONG(click_pos[0], click_pos[1])#将坐标转换成SendMessage()函数需要的一维数据的坐标
#print('tmp = ',tmp)
win32gui.SendMessage(hwnd, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)#鼠标左键在tmp位置按下
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP,0000,tmp)#鼠标左键在tmp位置弹起
#(弹起时,鼠标左键的代码是0000,有些电脑可能是win32con.MK_LBUTTON,具体情况需要通过手动在界面上点击鼠标左键,看spy++中的显示)
pause_t = random.random() * 3#产生一个随机0-3s的延时
count = random.random() * 10#产生一个随机0-10的计数循环
#print('int(count)=',int(count))
for i in range(1000):
time.sleep(pause_t)
for i in range(int(count)):#随机循环点击0-10次,每次间隔时间是0-1s
random_deltax = (random.random() - 0.5) * 15#在点击点的附近,x坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
random_deltay = (random.random() - 0.5) * 15#在点击点的附近,y坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
pause_random_t = random.random()#产生一个随机0-1s的延时
time.sleep(pause_random_t)#实现延时
#将点击点左边变成需要点击的界面上的坐标(这一步必须要有!)
click_pos =win32gui.ScreenToClient(hwnd,(click_x+int(random_deltax),click_y+int(random_deltay)))
tmp = win32api.MAKELONG(click_pos[0], click_pos[1])#将坐标转换成SendMessage()函数需要的一维数据的坐标
#print('tmp = ',tmp)
win32gui.SendMessage(hwnd, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)#鼠标左键在tmp位置按下
#time.sleep(t)#延迟时间t秒以后再弹起
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP,0000,tmp)#鼠标左键在tmp位置弹起
以下是整个程序
import win32gui
import win32api
import random
import time
import win32con
#win32gui和win32api有大量函数是重复的,也就是说既能通过gui来调用,也能通过api来调用,比如下面的FindWindow(),FindWindowEx(),GetWindowText(),GetWindowRect(),GetCursorPos()函数
def GetXY(): #获得模拟器的窗口位置
hwnd=win32gui.FindWindow('Qt5QWindowIcon','夜神模拟器')#是文件句柄,通过使用visual studio自带的spy++获得的。在工具栏中的 工具->spy++中,Qt5QWindowIcon是窗口类名,夜神模拟器 是窗口标题(窗口标题不一定是你窗口左上角显示的标题)
#print(hwnd)
#可操作窗口一般不是主窗口,一般是子窗口,子窗口必须使用FindWindowEx()函数来进行搜索
hwnd = win32gui.FindWindowEx(hwnd, 0, 'Qt5QWindowIcon', 'ScreenBoardClassWindow');#在窗口句柄为hwnd的窗口中,(本例是 夜神模拟器),寻找子窗口,同样是在spy++工具中看到的窗口信息。Qt5QWindowIcon是窗口类名,ScreenBoardClassWindow是窗口标题
hwnd = win32gui.FindWindowEx(hwnd, 0, 'Qt5QWindowIcon', 'QWidgetClassWindow');#在窗口句柄为hwnd的窗口中,(本例是 ScreenBoardClassWindow),寻找子窗口,同样是在spy++工具中看到的窗口信息。Qt5QWindowIcon是窗口类名,ScreenBoardClassWindow是窗口标题
#print('hwnd=',hwnd)
text = win32gui.GetWindowText(hwnd) #返回的是窗口的名字(不一定是窗口左上角显示的名字)
print('操作的窗口名为:',text)
left, top, right, bottom = win32gui.GetWindowRect(hwnd) #(left,top)是左上角的坐标,(right,bottom)是右下角的坐标
#win32gui.SetForegroundWindow(hwnd)
return (left,top,hwnd) #返回模拟器的左上角(x,y)坐标(即left,top),以及模拟器窗口的句柄
#mouseX, mouseY = win32gui.GetCursorPos() # 返回当前鼠标位置,注意坐标系统中左上方是(0, 0)
#print('mouseX=',mouseX,'mouseY=',mouseY)
def MoveAndClick(left, top, hwnd):#鼠标在目标窗口上的点击操作函数(点击的位置进行了随机,点击间隔时间也进行了随机)
click_x = left + 460#点击点的X坐标
click_y = top + 540#点击点的Y坐标
#print('click_x=',click_x,'click_y=',click_y) #检查点击点的坐标
random_deltax = (random.random() - 0.5) * 15#在点击点的附近,x坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
random_deltay = (random.random() - 0.5) * 15#在点击点的附近,y坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
click_pos =win32gui.ScreenToClient(hwnd,(click_x,click_y))#将点击点左边变成需要点击的界面上的坐标(这一步必须要有!)
tmp = win32api.MAKELONG(click_pos[0], click_pos[1])#将坐标转换成SendMessage()函数需要的一维数据的坐标
#print('tmp = ',tmp)
win32gui.SendMessage(hwnd, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)#鼠标左键在tmp位置按下
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP,0000,tmp)#鼠标左键在tmp位置弹起
#(弹起时,鼠标左键的代码是0000,有些电脑可能是win32con.MK_LBUTTON,具体情况需要通过手动在界面上点击鼠标左键,看spy++中的显示)
pause_t = random.random() * 3#产生一个随机0-3s的延时
count = random.random() * 10#产生一个随机0-10的计数循环
#print('int(count)=',int(count))
for i in range(1000):
time.sleep(pause_t)
for i in range(int(count)):#随机循环点击0-10次,每次间隔时间是0-1s
random_deltax = (random.random() - 0.5) * 15#在点击点的附近,x坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
random_deltay = (random.random() - 0.5) * 15#在点击点的附近,y坐标上产生一个[-7.5,7.5]区间的均匀分布的随机波动
pause_random_t = random.random()#产生一个随机0-1s的延时
time.sleep(pause_random_t)#实现延时
#将点击点左边变成需要点击的界面上的坐标(这一步必须要有!)
click_pos =win32gui.ScreenToClient(hwnd,(click_x+int(random_deltax),click_y+int(random_deltay)))#将点击点左边变成需要点击的界面上的坐标(这一步必须要有!)
tmp = win32api.MAKELONG(click_pos[0], click_pos[1])#将坐标转换成SendMessage()函数需要的一维数据的坐标
#print('tmp = ',tmp)
win32gui.SendMessage(hwnd, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0)
#win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, win32con.MK_LBUTTON, tmp)
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp)#鼠标左键在tmp位置按下
#time.sleep(t)#延迟时间t秒以后再弹起
win32gui.SendMessage(hwnd, win32con.WM_LBUTTONUP,0000,tmp)#鼠标左键在tmp位置弹起
print('我点!')
def main():
print('程序开始运行!')
left, top, hwnd = GetXY()
#print('left=',left,'top=',top,'hwnd=',hwnd)
MoveAndClick(left, top, hwnd)
#此处运行程序
main()