最近在做一个工具,主要是跟随微信窗口移动的,我的实现方法就是用 tkinter 创建一个界面,然后 win32api 获得微信窗口的实时位置,while True 实时 0.5s 获取一次位置,然后跟随微信窗口一起移动。
while True:
point = win32api.GetCursorPos()
print('当前鼠标坐标:' + str(point))
# 通过坐标获取窗口句柄
jb = win32gui.WindowFromPoint(point);
wintitle = get_title(jb)
# 获取窗口坐标
get_windows_location(jb)
time.sleep(0.5)
if(wintitle == '微信' or wintitle == ''):
root.state('normal')
root.update()
else:
root.state('withdrawn')
1
ysc3839 2022-07-20 10:32:47 +08:00
轮询应该不是正确的做法,用 SetWinEventHook 也许可以实现
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwineventhook |
2
ysc3839 2022-07-20 11:08:50 +08:00 3
自己试了下 SetWinEventHook 是可行的,窗口移动时会触发 EVENT_OBJECT_LOCATIONCHANGE 事件
|
3
codehz 2022-07-20 11:13:49 +08:00 via Android 1
( win32 的话,其实还有更 cursed 的方法:把目标窗口嵌入到自己窗口里,然后自己处理窗口事件,这样还能支持最大化(
|
5
delectate 2022-07-20 12:19:25 +08:00 1
1 、while true ,只要有 sleep ,就没问题,不会占用太多资源。这点可以放心;
2 、微信是 DirectUI 画的,很多时候标准的 api 不兼容,建议用最稳妥最笨的方法实现,反而可靠; 3 、尽量不要魔改微信,包括 hook 、修改任一可执行文件,嵌入窗体等等。鬼知道腾讯会不会一时兴起直接封号。 |
6
hanssx 2022-07-20 13:08:27 +08:00
2 楼方法应该是可以的,感觉只能 hook wx 窗口事件
|
8
uvwlab 2022-07-21 00:34:49 +08:00 via Android
肯定不能用轮训
|