4

我正在使用pyhookandpyhk映射 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

任何帮助表示赞赏。

谢谢!

4

2 回答 2

3

如果您只对 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

于 2012-08-02T19:57:54.623 回答
0

我在这里可能完全错了,但是根据我对 pyHook 文档的理解,为了防止按键被发送到另一个应用程序,您需要更改return Trueindef OnKeyboardEvent_up(event):OnKeyboardEvent(event,action=None,key='Z',context=None):to return False(或True.

于 2013-01-03T02:40:25.003 回答