使用pyhook响应键组合(而不仅是单个按键)?

11 投票
4 回答
12059 浏览
提问于 2025-04-16 09:19

我一直在找,但找不到如何使用pyhook来响应键盘上的组合键(比如 Ctrl + C)的例子。相对来说,找到如何响应单个按键(比如单独的 CtrlC)的例子就简单多了。

顺便说一下,我是在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

这里有关于GetKeyState的更多文档

撰写回答