在udev / sysfs中,键盘具有KEY
属性。例如,我有一个外部Mac键盘,它有两个“接口”:
/sys/bus/usb/devices/1-1.2.3.2:1.0
ID_INPUT_KEY: 1
ID_INPUT_KEYBOARD: 1
KEY: 10000 0 0 0 1007b00001007 ff9f207ac14057ff ffbeffdfffefffff fffffffffffffffe
/sys/bus/usb/devices/1-1.2.3.2:1.1
ID_INPUT_KEY: 1
KEY: 3a00000000 e000000000000 0
我假设第一个是实际键盘,第二个是特殊键,可能是弹出键。我如何解释KEY
属性?它似乎是某种位掩码定义了哪些键存在。它与扫描码有什么关系吗?
答案 0 :(得分:1)
该KEYS
字段似乎是键定义的位掩码,例如最低位对应第一个键。最高位对应于最后一个键。
那么钥匙从哪里来?尝试阅读input-event-codes.h
(例如,从here)以获取键的定义。然后,您可以按这些值进行位移,然后查看掩码是否匹配。
代码可能更清晰:
#!/usr/bin/env python
import sys
if len(sys.argv) > 1:
KEYS = sys.argv[1].replace(" ", "")
else:
KEYS="3a00000000 e000000000000 0".replace(" ", "")
inputkeys = int(KEYS, 16)
# /usr/src/linux-headers-4.15.0-24/include/uapi/linux/input-event-codes.h
if len(sys.argv) > 2:
linuxkeys = open(sys.argv[2], "r").read()
else:
linuxkeys = open("/usr/src/linux-headers-4.15.0-24/include/uapi/linux/input-event-codes.h", "r").read()
# Taken from https://gist.github.com/gsora/45ba7b98d31929e75317908a97488ef1
needle = "#define KEY_RESERVED"
linuxkeys = linuxkeys[linuxkeys.find(needle):]
needle = "#define KEY_MAX"
linuxkeys = linuxkeys[:linuxkeys.find(needle)]
keys = {}
for line in linuxkeys.splitlines():
goodline = line[8:].split("\t")
if line.startswith("#define ") and len(goodline)>1:
key = goodline[0]
for i in range(1, len(goodline)):
if goodline[i] == "":
continue
else:
value = goodline[i].rsplit()[0]
try:
v = int(value)
except ValueError:
if value.startswith("0x"):
v = int(value[2:], 16)
else:
v = keys[value]
keys[key] = v
break
for k,v in sorted(keys.items(), key=lambda x:x[1]):
if inputkeys & (1<<v):
print (k)
对于您的KEYS
字段,我得到:
KEY_SLASH
KEY_RIGHTSHIFT
KEY_KPASTERISK
KEY_RO
KEY_HIRAGANA
KEY_HENKAN
KEY_KATAKANAHIRAGANA