parent = win32gui.FindWindow(0,ParentName)
获取子句柄:(ChildClass为子句柄的类名(字符串))
child= win32gui.FindWindowEx(parent,None,ChildClass, None)
鼠标点击(可后台):(hwnd为需要点击的窗口句柄,cx、cy为点击位置在该窗口的相对坐标)
def doClick(cx,cy):
long_position = win32api.MAKELONG(cx, cy)#模拟鼠标指针 传送到指定坐标
win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)#模拟鼠标按下
win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)#模拟鼠标弹起
不知道为什么,我用第三方工具抓取的坐标一直有问题,就写了一段计算相对坐标的代码。当时主要跳的坑有计算的时候用的是我要找的那个窗口的父句柄,以至于坐标一直有偏差,后来意识到子句柄才是要找的,修改了一下,坐标就正确了。
# -*- coding:utf-8 -*-
import win32gui,win32api
import time
wdname = u'父句柄名称'
hwnd = win32gui.FindWindow(0, wdname) # 父句柄
hwnd1 = win32gui.FindWindowEx(hwnd, None,'类名称', None) # 目标子句柄
windowRec = win32gui.GetWindowRect(hwnd1) # 目标子句柄窗口的坐标
while True:
tempt = win32api.GetCursorPos() # 记录鼠标所处位置的坐标
x = tempt[0]-windowRec[0] # 计算相对x坐标
y = tempt[1]-windowRec[1] # 计算相对y坐标
print(x,y)
time.sleep(0.5) # 每0.5s输出一次
主要的问题是一开始没有搞懂父句柄和子句柄的概念,以及一开始把前台鼠标点击和后台鼠标点击混为一谈了,两者有很大的不同。前台是模拟鼠标点击这个动作,而后台是发送“鼠标点击”这个信息。
参考:
python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入
取色,大漠识别和后台点击
python和pywin32实现窗口查找、遍历和点击
[Python] 用python做一个游戏辅助脚本,完整思路
python中的句柄操作
通过pywin32库来上传文件