从这么生成的击键中阻止pyhook?

时间:2012-07-25 21:09:36

标签: python windows keyboard keyboard-shortcuts pyhook

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

任何帮助表示感谢。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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