在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属性?它看起来像是某种位掩码,定义了哪些键存在。它与扫描码有什么关系吗?
发布于 2018-07-12 04:52:32
该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_KATAKANAHIRAGANAhttps://stackoverflow.com/questions/48042502
复制相似问题