【问题标题】:How do I use my own loop with pyhook instead of pumpMessages()?如何使用我自己的循环与 pyhook 而不是 pumpMessages()?
【发布时间】:2012-04-04 03:47:33
【问题描述】:

我正在尝试使用 pyhooks 来检测屏幕上任意位置的鼠标点击。问题是我只能让它与 PumpMessages() 一起工作。我希望它在我构建的 while 循环内运行。有没有办法做到这一点/为什么需要 pumpMessages?

def onclick(event):
    print 'Mouse click!'
    return True


hm = pyHook.HookManager()

hm.MouseLeftDown = onclick

hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()

以上是我让它运行的唯一方法。

我正在尝试完成这样的事情:

sTime = time.time()

def onclick(event):
    global sTime
    print 'Time between clicks equals: %i' % time.time() - stime
    sTime = time.time()
    return True

hm.MouseLeftDown = OnClick

while True:

    hm.HookMouse()

编辑:我不是一个聪明人。场景中不需要while循环..

叹息..

【问题讨论】:

    标签: python pyhook


    【解决方案1】:

    仅供参考,您可以在while 循环中使用pythoncom.PumpWaitingMessages(),因为它不会锁定执行。像这样的:

    while True:
        # your code here
        pythoncom.PumpWaitingMessages()
    

    【讨论】:

    • 同意布偶。这应该是正确的答案。谢谢你,在找到这个简单的解决方案之前我搜索了很长时间,
    • 但是因为它是非阻塞的,这不是占用 CPU 吗?
    • 这取决于你的代码在做什么。例如,在我的代码中,我需要在发送消息之前检查很多事情,所以我不能在PostQuitMessage 调用中被阻止。
    【解决方案2】:

    From the pyhook tutorial:

    任何希望接收全局输入通知的应用程序 事件必须具有 Windows 消息泵。

    但是,这不一定会阻止您的代码正常工作。您为什么不发布您正在尝试做的事情,我们可以寻找一种在您的代码上下文中使用消息泵的方法。

    您可能能够解决问题的一种方法是通过 PostQuitMessages(原始解决方案 here

    import ctypes
    ctypes.windll.user32.PostQuitMessage(0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 2012-01-27
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2010-12-03
      • 2014-10-23
      相关资源
      最近更新 更多