使用pyhook响应键组合(而不仅是单个按键)?
我一直在找,但找不到如何使用pyhook来响应键盘上的组合键(比如 Ctrl + C)的例子。相对来说,找到如何响应单个按键(比如单独的 Ctrl 或 C)的例子就简单多了。
顺便说一下,我是在Windows XP上使用Python 2.6。
任何帮助都非常感谢。
4 个回答
7
其实,Ctrl+C有它自己的ASCII码(就是3)。类似下面这样的代码对我有效:
import pyHook,pythoncom
def OnKeyboardEvent(event):
if event.Ascii == 3:
print "Hello, you've just pressed ctrl+c!"
8
你可以用下面的代码来查看pyHook返回了什么:
import pyHook
import pygame
def OnKeyboardEvent(event):
print 'MessageName:',event.MessageName
print 'Ascii:', repr(event.Ascii), repr(chr(event.Ascii))
print 'Key:', repr(event.Key)
print 'KeyID:', repr(event.KeyID)
print 'ScanCode:', repr(event.ScanCode)
print '---'
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
# initialize pygame and start the game loop
pygame.init()
while True:
pygame.event.pump()
通过这个代码,看来pyHook返回的是
c: Ascii 99, KeyID 67, ScanCode 46
ctrl: Ascii 0, KeyID 162, ScanCode 29
ctrl+c: Ascii 3, KeyID 67, ScanCode 46
(Python 2.7.1,Windows 7,pyHook 1.5.1)
9
你有没有试过使用HookManager里的GetKeyState方法?我没有测试过这个代码,但它应该是这样的:
from pyHook import HookManager
from pyHook.HookManager import HookConstants
def OnKeyboardEvent(event):
ctrl_pressed = HookManager.GetKeyState(HookConstants.VKeyToID('VK_CONTROL') >> 15)
if ctrl_pressed and HookConstant.IDToName(event.keyId) == 'c':
# process ctrl-c