在Python中获取keypress的键盘代码

时间:2013-12-04 07:36:01

标签: python

我正在尝试获取在python中按下的字符的键盘代码。为此,我需要查看是否按下了键盘编号。

这不是我想要的

import tty, sys

tty.setcbreak(sys.stdin)

def main():
    tty.setcbreak(sys.stdin)
    while True:
        c = ord(sys.stdin.read(1))
        if c == ord('q'):
            break
    if c:
        print c

输出字符的ascii代码。这意味着,我得到的键盘1与普通1相同。 我还尝试使用curses库和raw进行类似设置,结果相同。

我正在尝试获取原始键盘代码。如何做到这一点?

3 个答案:

答案 0 :(得分:2)

正如合成器专家所说,我需要进入较低的水平。

使用pyusb:

import usb.core, usb.util, usb.control

dev = usb.core.find(idVendor=0x045e, idProduct=0x0780)

try:
    if dev is None:
        raise ValueError('device not found')

    cfg = dev.get_active_configuration()

    interface_number = cfg[(0,0)].bInterfaceNumber
    intf = usb.util.find_descriptor(
        cfg, bInterfaceNumber=interface_number)

    dev.is_kernel_driver_active(intf):
        dev.detach_kernel_driver(intf)


    ep = usb.util.find_descriptor(
        intf,
        custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN)

    while True:
        try:
            # lsusb -v : find wMaxPacketSize (8 in my case)
            a = ep.read(8, timeout=2000)
        except usb.core.USBError:
            pass
        print a
except:
    raise

这会为您提供输出:array('B', [0, 0, 0, 0, 0, 0, 0, 0])

数组pos:     0:修改键的AND(1 - 控制,2 - 移位,4 - meta,8 - super)     1:不知道     2-7:按下键的密钥代码。

这样:

[3, 0 , 89, 90, 91, 92, 93, 94]

是:

ctrl+shift+numpad1+numpad2+numpad3+numpad4+numpad5+numpad6

如果有人知道第二个索引存储的内容,那就太棒了。

答案 1 :(得分:1)

要从Python获取原始键盘输入,您需要窥探比读取标准输入更低的级别。

对于OSX,请查看以下答案:

OS X - Python Keylogger - letters in double

对于Windows,这可能有效:

http://www.daniweb.com/software-development/python/threads/229564/python-keylogger

monitor keyboard events with python in windows 7

答案 2 :(得分:0)

如果你有opencv检查这个简单的代码:

`
import cv2, numpy as np
img = np.ones((100,100))*100
while True:
    cv2.imshow('tracking',img)
    keyboard = cv2.waitKey(1)   & 0xFF
    if keyboard !=255:
        print keyboard
    if keyboard==27 or keyboard==ord('q'):
        break
cv2.destroyAllWindows()`

现在当空白窗口打开时按任意键盘键。 Hesam