字符串到 HID 键码

问题描述 投票:0回答:2

我需要一些关于将字符串转换为代表键盘上按键的 HID 键代码的帮助/建议。这些 HID 代码是字节,并且有可用列表表here

我最初的想法是搜索一个表然后使用循环将字符串中的字符匹配到一个表但不幸的是它对我不起作用。

我怎么能在一个简单的 python 脚本中做到这一点?我试图搜索其他答案但没有结果。这些代码将被发送到 /dev/hidg0,它被作为击键处理。

python raspberry-pi keyboard hardware hid
2个回答
1
投票

正确的键盘输入很难。 ))

您可以从官方来源获取带有 HID Usages 的 JSON:

HID Usage Tables 1.4 文档还包括所有使用定义作为 JSON 文件作为 PDF 的附件。 PDF 是“唯一”的真实来源。

https://www.usb.org/hid

您可以使用 https://www.pdfconvertonline.com/extract-pdf-attachments-online.html 提取压缩的 json 文件。

相关部分:

{
  "Kind": "Defined",
  "Id": 7,
  "Name": "Keyboard/Keypad",
  "UsageIds": [
...
{
  "Id": 4,
  "Name": "Keyboard A",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 5,
  "Name": "Keyboard B",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 6,
  "Name": "Keyboard C",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 7,
  "Name": "Keyboard D",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 8,
  "Name": "Keyboard E",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 9,
  "Name": "Keyboard F",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 10,
  "Name": "Keyboard G",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 11,
  "Name": "Keyboard H",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 12,
  "Name": "Keyboard I",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 13,
  "Name": "Keyboard J",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 14,
  "Name": "Keyboard K",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 15,
  "Name": "Keyboard L",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 16,
  "Name": "Keyboard M",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 17,
  "Name": "Keyboard N",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 18,
  "Name": "Keyboard O",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 19,
  "Name": "Keyboard P",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 20,
  "Name": "Keyboard Q",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 21,
  "Name": "Keyboard R",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 22,
  "Name": "Keyboard S",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 23,
  "Name": "Keyboard T",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 24,
  "Name": "Keyboard U",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 25,
  "Name": "Keyboard V",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 26,
  "Name": "Keyboard W",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 27,
  "Name": "Keyboard X",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 28,
  "Name": "Keyboard Y",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 29,
  "Name": "Keyboard Z",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 30,
  "Name": "Keyboard 1 and Bang",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 31,
  "Name": "Keyboard 2 and At",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 32,
  "Name": "Keyboard 3 and Hash",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 33,
  "Name": "Keyboard 4 and Dollar",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 34,
  "Name": "Keyboard 5 and Percent",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 35,
  "Name": "Keyboard 6 and Caret",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 36,
  "Name": "Keyboard 7 and Ampersand",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 37,
  "Name": "Keyboard 8 and Star",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 38,
  "Name": "Keyboard 9 and Left Bracket",
  "Kinds": [
    "Sel"
  ]
},
{
  "Id": 39,
  "Name": "Keyboard 0 and Right Bracket",
  "Kinds": [
    "Sel"
  ]
},

如果您只想在美国 QWERTY 键盘布局转换中使用 US-ASCII

character <-> HID usage
,那么只需映射:

  • 0004:0007..0004:0001D
    ->
    a..z
  • 0004:001E..0004:00027
    ->
    1..9,0

如果您需要进行更高级的

character -> HID usage
转换,那么您需要查看键盘布局映射(每种键盘布局语言可能将不同的键映射到不同的字符 - 美国 QWERTY、法语 AZERTY、德语 QWERTZ、俄语 ЙЦУКЕН 等)。访问这些映射是特定于平台的,并且绑定到也是特定于平台的
keycodes
(这是我们在 HID 规范甚至存在之前所拥有的)。

例如

keycode -> character
Linux 的表位于此处 并且 Linux 键码在特殊的头文件中定义.

Windows 在内部使用 PS/2 扫描码作为键码,将扫描码映射到字符的官方方法是 ToUnicode[Ex] API。

此外,您可以查看 Unicode CLDR 项目。除其他外,它包含不同键盘布局和映射的数据库键盘按钮->字符https://github.com/unicode-org/cldr/tree/main/keyboards

在 CLDR 中,为了更容易识别键,键盘上的行被命名为从底行的“A”开始到顶行的“E”。功能部分中的键行被认为在“K”行中。这些行名与ISO9995-1中给出的一致。所以这里我们有另一组键码。 ))


0
投票

您可以使用

dict
来有效存储代码表。还要考虑
str.translate()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.