Python模拟鼠键操作

Python后台模拟鼠标操作----win32api,win32gui,win32con,spy++(最重要!!)

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()

猜你喜欢

转载自blog.csdn.net/weixin_42152531/article/details/83413279