【问题标题】:Block pyhook from so-generated keystrokes?从如此生成的击键中阻止pyhook?
【发布时间】:2012-07-24 09:54:15
【问题描述】:

我正在使用pyhookpyhk 在Windows XP 机器上映射击键,它工作正常,除非击键(例如,ctrl+z)已经存在于应用程序中。在这种情况下,ctrl+z 传递给应用程序触发已映射到它的操作。

如果您熟悉autohotkey,请注意autohotkey 通过定义可以选择传递给底层应用程序的热键来解决这个问题。这里有一些代码可以理解这个想法。请注意,我正在尝试跟踪 ctrl 键何时按下。

  import pythoncom, pyHook
  control_down = False

  def OnKeyboardEvent_up(event):
      global control_down
      if event.Key=='Lcontrol' or event.Key=='Rcontrol':
         control_down=False
      return True

  def OnKeyboardEvent(event,action=None,key='Z',context=None):
      global control_down
      if event.Key=='Lcontrol' or event.Key=='Rcontrol':
         control_down=True
      if control_down and event.Key==key:
         print 'do something'
         return False
      if event.Key=='Pause':
         win32gui.PostQuitMessage(1)
         return False
      # return True to pass the event to other handlers
      return True

  if __name__ == '__main__':
     hm = pyHook.HookManager()
     hm.KeyDown = OnKeyboardEvent
     hm.KeyUp = OnKeyboardEvent_up
     hm.HookKeyboard() # set the hook
     pythoncom.PumpMessages() # wait forever

任何帮助表示赞赏。

谢谢!

【问题讨论】:

  • 遗憾的是(跨平台)热键支持目前在 Python 中非常糟糕高级(咳嗽)之类的东西非常难。我正在考虑尽快为此编写自己的包。

标签: python windows keyboard keyboard-shortcuts pyhook


【解决方案1】:

如果您只对 Windows 感兴趣,您可以使用 win API,例如通过 ctypes:

>>> from ctypes import windll
>>> windll.user32.RegisterHotKey(0, -1, 0x0002, 0x5a)

运行这几行代码后Ctrl (code = 0x0002) + Z (code = 0x5a)组合在 Python REPL 中不再起作用。

所以你最好看看那些热键注册的窗口是什么。您可以在 MSDN 中找到更多信息:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx

【讨论】:

    【解决方案2】:

    我在这里可能完全错了,但是根据我对 pyHook 文档的理解,为了防止按键被发送到另一个应用程序,您需要将 def OnKeyboardEvent_up(event):OnKeyboardEvent(event,action=None,key='Z',context=None): 中的 return True 更改为 @987654324 @(或True以外的任何其他内容。

    【讨论】:

    • @reckoner 我实际上只是运行了问题中的代码,并没有看到 ctrl+z 映射到我在运行脚本时所在的应用程序,即使使用 return True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多