V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pytth
V2EX  ›  Python

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

  •  
  •   pytth · 2022-07-20 10:26:09 +08:00 · 2759 次点击
    这是一个创建于 848 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一个工具,主要是跟随微信窗口移动的,我的实现方法就是用 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 循环下去会不会占用电脑过多的资源?或者大家有没有其他更好的方案去做这个效果?
    8 条回复    2022-07-21 00:34:49 +08:00
    ysc3839
        1
    ysc3839  
       2022-07-20 10:32:47 +08:00
    轮询应该不是正确的做法,用 SetWinEventHook 也许可以实现
    https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwineventhook
    ysc3839
        2
    ysc3839  
       2022-07-20 11:08:50 +08:00   ❤️ 3
    自己试了下 SetWinEventHook 是可行的,窗口移动时会触发 EVENT_OBJECT_LOCATIONCHANGE 事件
    codehz
        3
    codehz  
       2022-07-20 11:13:49 +08:00 via Android   ❤️ 1
    ( win32 的话,其实还有更 cursed 的方法:把目标窗口嵌入到自己窗口里,然后自己处理窗口事件,这样还能支持最大化(
    pytth
        4
    pytth  
    OP
       2022-07-20 11:37:31 +08:00
    @ysc3839 多谢,也试一下!
    delectate
        5
    delectate  
       2022-07-20 12:19:25 +08:00   ❤️ 1
    1 、while true ,只要有 sleep ,就没问题,不会占用太多资源。这点可以放心;
    2 、微信是 DirectUI 画的,很多时候标准的 api 不兼容,建议用最稳妥最笨的方法实现,反而可靠;
    3 、尽量不要魔改微信,包括 hook 、修改任一可执行文件,嵌入窗体等等。鬼知道腾讯会不会一时兴起直接封号。
    hanssx
        6
    hanssx  
       2022-07-20 13:08:27 +08:00
    2 楼方法应该是可以的,感觉只能 hook wx 窗口事件
    pytth
        7
    pytth  
    OP
       2022-07-20 14:04:46 +08:00
    @delectate 我感觉也是,hook 微信感觉会被监测进程,如果只是寄生在微信身上又不会被微信发现。
    uvwlab
        8
    uvwlab  
       2022-07-21 00:34:49 +08:00 via Android
    肯定不能用轮训
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1591 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:08 · PVG 01:08 · LAX 09:08 · JFK 12:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.