2012-07-25 86 views
4

我使用pyhookpyhk來映射Windows XP機器上的擊鍵,並且除了在應用程序中已經存在擊鍵(例如,ctrl + z)時它工作正常。在這種情況下,ctrl + z會傳遞給應用程序,並且會觸發已映射到該應用程序的操作。從生成的擊鍵中阻止pyhook?

如果您熟悉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 

任何幫助表示讚賞。

謝謝!

+1

可悲的是(跨平臺)熱鍵支持是__very bad__現在Python編寫的。像這樣的_Advanced(咳嗽)_東西是很困難的。我正在考慮寫我自己這段時間很快就會出現。 – orlp 2012-07-25 21:11:50

回答

2

如果您只對Windows有興趣,可以使用win API,例如通過ctypes的:

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

運行的代碼這些行按Ctrl(代碼= 0×0002)+ Z(代碼= 0x5a)組合不會在Python REPL工作了。

所以你最好看看哪些窗口是那些熱鍵註冊的。更多信息,您可以在MSDN中找到:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309(v=vs.85).aspx

0

我可以完全錯誤的位置,但是從我的pyHook文件的理解,以防止按鍵被髮送到另一個應用程序,您需要更改return Truedef OnKeyboardEvent_up(event):OnKeyboardEvent(event,action=None,key='Z',context=None):return False(或別的以外True

+0

@reckoner我其實剛剛從問題中運行代碼,並沒有看到ctrl + z被映射到我在運行時運行的應用程序即使是「真實的回報」也是如此。 – andrewmh20 2013-01-03 03:44:38