一 win32gui
1 通过坐标点找窗口句柄
import win32gui
hid = win32gui.WindowFromPoint((100, 100))
2 通过句柄获取窗口标题或类名
title = win32gui.GetWindowText(hid)
class_name = win32gui.GetClassName(hid)
3 通过标题找到窗口的句柄
方法1:通过标题查找,仅返回一个顶层窗口的句柄,不支持模糊查询
# 参数:类名,窗口标题,未找到返回0
hid = win32gui.FindWindow(None, "照片")
方法2:遍历查找到所有可能符合标题的句柄,支持模糊查找
import win32gui
def find_hid_by_title(title):
hid_title_dict = {}
def get_all_hid_title(hid, arg):
# IsWindow:如果窗口句柄标识了一个已存在的窗口,返回值为非零;如果窗口句柄未标识一个已存在窗口,返回值为零
# IsWindowEnabled:若窗口允许接受键盘或鼠标输入,则返回非0值,若窗口不允许接受键盘或鼠标输入,则返回值为0。
# IsWindowVisible:该函数获得给定窗口的可视状态
if win32gui.IsWindow(hid) and win32gui.IsWindowEnabled(hid) and win32gui.IsWindowVisible(hid):
hid_title_dict[hid] = win32gui.GetWindowText(hid)
# 枚举屏幕上所有顶层窗口,参数:回调函数,传递给回调函数的第二个参数
win32gui.EnumWindows(get_all_hid_title, 0)
# 找到含title的窗口
match_res = {}
for k, v in hid_title_dict.items():
if str(title) in v:
match_res[k] = v
return match_res
if __name__ == "__main__":
res = find_hid_by_title("照片")
if len(res) == 0:
print("未找到句柄")
else:
for hid, title in res.items():
print(f"hid: {hid}, title: {title}")
4 通过句柄获取窗口位置和大小
# 获取相对屏幕左上角的位置,得到窗口左上角和右下角坐标
left, top, right, bottom = win32gui.GetWindowRect(hid)
5 通过句柄设置窗口位置和大小
hid = 1509318
# 参数:句柄,窗口左边界,窗口上边界,窗口宽度,窗口高度,确定窗口是否被刷新
win32gui.MoveWindow(hid, 100, 100, 800, 800, True)
6 通过父句柄获取字句柄信息
方法一:枚举
import win32gui
def child_handler(cid, child_info_list):
rect = win32gui.GetWindowRect(cid)
class_name = win32gui.GetClassName(cid)
child_info_list.append([cid, class_name, rect])
def get_child_info(hid):
child_info_list = []
win32gui.EnumChildWindows(hid, child_handler, child_info_list)
return child_info_list
if __name__ == "__main__":
hid = 1509318
print(get_child_info(hid))
方法二:递归查询
import win32gui
def find_all_child_hid(hid):
res = []
def find_child_hid(hid, res, child_hid=None, class_name=None, title=None):
# 参数:父窗口句柄,子窗口句柄,子类名,子类标题
c_id = win32gui.FindWindowEx(hid, child_hid, class_name, title)
if c_id != 0:
res.append(c_id)
find_child_hid(hid, res, child_hid=c_id)
find_child_hid(hid, res)
return res
def get_all_child_info(hid):
cid_list = find_all_child_hid(hid)
res = []
for item in cid_list:
rect = win32gui.GetWindowRect(item)
class_name = win32gui.GetClassName(item)
res.append([item, class_name, rect])
return res
if __name__ == "__main__":
hid = 1509318
print(get_all_child_info(hid))
7 激活句柄窗口
hid = 2556718
# 将创建指定窗口的线程设置到前台,并且激活该窗口
win32gui.SetForegroundWindow(hid)
二 win32api
1 获取或设置鼠标位置
import win32api
# 设置位置
win32api.SetCursorPos((100, 100))
# 获取位置
point = win32api.GetCursorPos()
print(point)
2 模拟鼠标点击
参数
win32api.mouse_event(flags, x, y, data, extra_info)
"""
flags:
MOUSEEVENTF_LEFTDOWN:表明接按下鼠标左键。
MOUSEEVENTF_LEFTUP:表明松开鼠标左键。
MOUSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOUSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOUSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOUSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOUSEEVENTF_WHEEL:鼠标轮移动,数量由data给出。
"""
左击
import win32api, win32con
def left_click(point):
win32api.SetCursorPos(point)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)
if __name__ == "__main__":
point = (734, 737)
left_click(point)
三 鼠标点击获取句柄和相对位置
pynput绑定鼠标事件
import win32gui
from pynput import mouse
from multiprocessing import Process
class GetHid:
def __init__(self):
self.res = {}
def get_some(self, x, y, button, press):
hid = win32gui.WindowFromPoint((x, y))
title = win32gui.GetWindowText(hid)
class_name = win32gui.GetClassName(hid)
rect = win32gui.GetWindowRect(hid)
self.res.update({
"hid": hid,
"relx": x - rect[0],
"rely": y - rect[1],
"rect": rect,
"class_name": class_name,
"title": title,
})
print(self.res)
def _get_hid(self):
while True:
with mouse.Listener(on_click=self.get_some) as lis:
lis.join()
def main(self):
self._get_hid()
if __name__ == "__main__":
p1 = Process(target=GetHid().main)
p1.start()
p1.join()
四 通过句柄和坐标模拟后台点击
import win32api
import win32con
import win32gui
def left_click(rx, ry, hwnd):
# 模拟鼠标指针 传送到窗口相对坐标
long_position = win32api.MAKELONG(rx, ry)
# 模拟鼠标左击
win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)
win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)
if __name__ == "__main__":
# 找到句柄和相对点击位置
hwnd = 66518
cx = 238
cy = 23
left_click(cx, cy, hwnd)