2011-01-03 70 views
9

Tôi đã tìm kiếm xung quanh nhưng tôi không thể tìm thấy một ví dụ về cách sử dụng pyhook để đáp ứng với key kết hợp như Ctrl +C trong khi nó rất dễ dàng để tìm ví dụ về làm thế nào để đáp ứng với đơn các phím bấm như Ctrl hoặc C riêng biệt.Sử dụng pyhook để trả lời cho tổ hợp phím (không chỉ một lần nhấn phím)?

BTW, tôi đang nói về Python 2.6 trên Windows XP.

Bất kỳ trợ giúp đánh giá cao.

Trả lời

7

Bạn đã cố sử dụng phương pháp GetKeyState từ HookManager chưa? Tôi đã không kiểm tra mã nhưng nó phải là một cái gì đó như thế này:

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 

Đây là further documentation on GetKeyState

+0

Điều này cho tôi một lỗi cú pháp trong Python 2.5 ... – Muhd

+0

Bạn đang thiếu một ')' trên dòng thứ năm. – Muhd

+3

Và GetKeyState Dường như không tồn tại. – Muhd

6

Bạn có thể sử dụng đoạn mã sau để xem những gì pyHook trả:

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() 

sử dụng này, dường như pyHook trả

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)

+1

vâng, tôi đã thực sự thử mã này trước đây nhưng có vẻ như đang xử lý từng phím tắt riêng biệt mặc dù bạn đang giữ chúng cùng một lúc. Tôi không nghĩ rằng có một mã khóa cho một sự kết hợp của tổ hợp phím. – reckoner

7

Trên thực tế Ctrl + C có mã Ascii riêng của nó (đó là 3). Một cái gì đó như thế này hoạt động cho tôi:

import pyHook,pythoncom 

def OnKeyboardEvent(event): 
    if event.Ascii == 3: 
     print "Hello, you've just pressed ctrl+c!" 
+1

Trong khi câu trả lời này hữu ích, tôi sẽ không upvote nó. Điều này giải quyết tình huống cụ thể này, nhưng nếu tôi muốn chụp ** Shift + PrintScreen ** thì sao? –

Các vấn đề liên quan