Python 实现这种跟随窗口移动的效果还有什么办法?

2022-07-20 10:26:09 +08:00
 pytth

最近在做一个工具,主要是跟随微信窗口移动的,我的实现方法就是用 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')


一直 while True 循环下去会不会占用电脑过多的资源?或者大家有没有其他更好的方案去做这个效果?
2769 次点击
所在节点    Python
8 条回复
ysc3839
2022-07-20 10:32:47 +08:00
轮询应该不是正确的做法,用 SetWinEventHook 也许可以实现
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwineventhook
ysc3839
2022-07-20 11:08:50 +08:00
自己试了下 SetWinEventHook 是可行的,窗口移动时会触发 EVENT_OBJECT_LOCATIONCHANGE 事件
codehz
2022-07-20 11:13:49 +08:00
( win32 的话,其实还有更 cursed 的方法:把目标窗口嵌入到自己窗口里,然后自己处理窗口事件,这样还能支持最大化(
pytth
2022-07-20 11:37:31 +08:00
@ysc3839 多谢,也试一下!
delectate
2022-07-20 12:19:25 +08:00
1 、while true ,只要有 sleep ,就没问题,不会占用太多资源。这点可以放心;
2 、微信是 DirectUI 画的,很多时候标准的 api 不兼容,建议用最稳妥最笨的方法实现,反而可靠;
3 、尽量不要魔改微信,包括 hook 、修改任一可执行文件,嵌入窗体等等。鬼知道腾讯会不会一时兴起直接封号。
hanssx
2022-07-20 13:08:27 +08:00
2 楼方法应该是可以的,感觉只能 hook wx 窗口事件
pytth
2022-07-20 14:04:46 +08:00
@delectate 我感觉也是,hook 微信感觉会被监测进程,如果只是寄生在微信身上又不会被微信发现。
uvwlab
2022-07-21 00:34:49 +08:00
肯定不能用轮训

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867459

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX