Используете pyhook для ответа на комбинацию клавиш (а не только на отдельные нажатия клавиш)? - PullRequest
10 голосов
/ 03 января 2011

Я искал, но не могу найти пример того, как использовать pyhook для ответа на комбинации клавиш , такие как Ctrl + C тогда как легко найти примеры того, как реагировать на отдельные нажатия клавиш, такие как Ctrl или C отдельно.

Кстати, я говорю о Python 2.6 в WindowsXP.

Любая помощь приветствуется.

Ответы [ 4 ]

9 голосов
/ 05 февраля 2011

Вы пытались использовать метод GetKeyState из HookManager? Я не тестировал код, но он должен выглядеть примерно так:

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

7 голосов
/ 03 февраля 2012

На самом деле Ctrl + C имеет свой собственный код Ascii (который равен 3).Как-то так у меня работает:

import pyHook,pythoncom

def OnKeyboardEvent(event):
    if event.Ascii == 3:
        print "Hello, you've just pressed ctrl+c!"
7 голосов
/ 04 января 2011

Вы можете использовать следующий код, чтобы посмотреть, что возвращает 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)

0 голосов
/ 23 мая 2018

Мне не повезло ни с одним из других ответов, так что это то, что я взял на себя

class Keystroke_Watcher:
    def __init__(self, master):
        self.hm = HookManager()
        self.hm.KeyDown = self.on_key_down
        self.hm.KeyUp = self.on_key_up
        self.hm.HookKeyboard()
        self.keys_held = set()  # set of all keys currently being pressed

    def get_key_combo_code(self):
        # find some way of encoding the presses.
        return '+'.join([HookConstants.IDToName(key) for key in self.keys_held])

    def on_key_down(self, event):
        try:
            self.keys_held.add(event.KeyID)
        finally:
            return True

    def on_key_up(self, event):
        keycombo = self.get_key_combo_code()
        print(keycombo)
        try:
            # Do whatever you want with your keycombo here
        finally:
            self.keys_held.remove(event.KeyID)
            return True

    def shutdown(self):
        PostQuitMessage(0)
        self.hm.UnhookKeyboard()
...