linux键盘输入日志记录-键盘映射翻译

时间:2019-09-29 13:44:10

标签: c++ linux keyboard

我正在写一个类来监视Linux上的输入事件。 它将在守护程序中使用,该守护程序将在gui程序中作用于用户的按键,以在USB led设备上提供视觉反馈。

我使用从/ dev / input / event *中读取的输入事件。我正在使用<linux/input.h>,我得到了键码。

我在比利时键盘上。我按下并释放键盘上的“ A”键,当前日志显示为:

29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, type 4 (Misc), code 4 (ScanCode), value 0x10
29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, type 1 (Key), code 16 (Q), value 1
29/09/2019 - 14:14:48.751 [Info] Event: time 1569759288.751445, -------------- Report Sync ------------
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, type 4 (Misc), code 4 (ScanCode), value 0x10
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, type 1 (Key), code 16 (Q), value 0
29/09/2019 - 14:14:48.792 [Info] Event: time 1569759288.792115, -------------- Report Sync ------------

在没有任何修饰键的情况下实际在屏幕上打印的内容是一个小'a'

请注意“代码16(Q)”-数字16是基数为10的键控代码。

我现在需要将“ Q”映射到我的键盘布局,在这种情况下,它应该记录为“ a”。 为此,我使用dumpkeys程序获取内核的当前转换表。

就此特定示例而言,输出的缩短数据(仅显示4列)为:

keycode  16 = +a               +A               at               VoidSymbol

或更合适的格式:

keycode  16 = +0x0b61          +0x0b41          0x0040           0x0200 

默认情况下,+表示可移动。在此阶段,我不确定是否需要考虑这一点,因此我将其删除。

据我了解,dumpkeys程序将0xb00添加到正确的数字,因此,我将+从0x0b61减去0x0b00以获得0x0061。

0x0061是'a'的Unicode编号U + 0061,我将该QString存储在位置0的向量中,因此,与dumpkeys有关的第一列。

现在解决问题:

某些键还可以。如果我解释具有字符“ 1”,“&”,“ |”的物理密钥的数据在我的键盘上,所有这些都可以通过修改键来检出。

但是对于此示例(物理密钥仅带有大写字母'A'),这是不正确的。

根据keymaps(5)-Linux手册页中解释的修饰符规则,应发生以下情况:

我按下键码16却没有任何修饰键,然后得到U + 0061或'a'->好的-动作编号为零(从第一列开始)

我用换档修饰键按下键代码16,然后我得到U + 0041或'A'->好的,因为换档修饰符的权重为1,所以动作编号为1(来自第二列)

我用AltGr修饰键按下键码16,然后得到U + 0040或'@'->好的,AltGr的重量为2-所以第二个动作(从第三列开始)

现在,如果我将Shift和AltGr一起按下键码16,则权重加起来为3,因此动作编号3(来自第4列)又称为VoidSymbol,因此不会发生任何响声。我得到的是大写的欧米茄“Ω”。为什么?

对于那个VoidSymbol,U + 0200实际上是Ȁ(带有Double Grave的拉丁大写字母a)。如果将其字符的unicode值用作VoidSymbol,则如何打印该字符?

还有其他问题。

另一个示例是上面带有'§','6','^'的物理密钥。键盘映射转储键使我无法找到'§'字符(U + 00A7)的踪迹。但是,我可以输入...

默认情况下,shiftable是怎么回事?

编辑:其他问题

#define modifierShift 1;    //why the difference between ShiftL and ShiftR -> there is no 'shift' key
#define modifierControl 4;  //why the difference between ControlL and ControlR -> there is no 'control' key
#define modifierShiftL 16;  //code 42
#define modifierShiftR 32;  //code 54
#define modifierCtrlL 64;   //code 29
#define modifierCtrlR 128;  //code 97

有人可以帮我澄清一下吗?

0 个答案:

没有答案