C++ 获取c+中的状态xev linux值+;

C++ 获取c+中的状态xev linux值+;,c++,linux,keyboard,C++,Linux,Keyboard,我试图实现一个虚拟键盘应用程序,我需要知道什么时候我必须伪造一个修改器按键 例如: 要有一个“Z”,我必须假键按住“SHIFT”,然后假键按下并假键释放“Z”,然后假键释放“SHIFT”。 对于A-Z,它很容易知道,我必须按哪个键,因为它总是和非大写字母相同 但是当你想要这种角色时: ; or . or { or % or * 它始终取决于您的键盘,例如: 实际上,我使用的是西班牙qwerty键盘,“,”和“;”在同一个键上,所以它们有相同的键码,但要得到“;”我需要先假键按下“SHIFT”才

我试图实现一个虚拟键盘应用程序,我需要知道什么时候我必须伪造一个修改器按键

例如:

要有一个“Z”,我必须假键按住“SHIFT”,然后假键按下并假键释放“Z”,然后假键释放“SHIFT”。 对于A-Z,它很容易知道,我必须按哪个键,因为它总是和非大写字母相同

但是当你想要这种角色时:

; or . or { or % or *
它始终取决于您的键盘,例如:

实际上,我使用的是西班牙qwerty键盘,“,”和“;”在同一个键上,所以它们有相同的键码,但要得到“;”我需要先假键按下“SHIFT”才能得到它。 因为特殊字符的映射总是不同的,而且我的程序必须在不同类型的计算机上运行,所以我正在寻找一种方法,在输入corespondig键代码之前,知道何时需要假键按下修改器

我通过在终端上运行xev并按下“A”(按住“SHIFT”键并按下“A”)来找到这一点:

“状态”(第3行)值表示是否正在按下修改器,如果未按下,则值为0x0。 我想找到一种方法来获得它在C++中。
谢谢大家。

你们试过
man XKeyEvent
吗?我认为这些结构可以帮助你们伪造密钥事件,但我仍然找不到一种方法来知道我是否需要修改器。你们可以通过几个修改器调用
XkbLookupKeySym
,以找到哪些修改器可以用给定的密钥代码生成所需的密钥ym。用另一种方法(keysym->keycode+修饰符)做这件事并不明显。可以使用不同的keycode+修饰符生成相同的keysym;返回哪种组合?顺便说一句,由于您使用的是西班牙语键盘,您还需要了解如何生成重音字符。@n.m.好的,我将使用
XkbLookupKeySym
尝试您的解决方案,它似乎可以完成这项工作。谢谢
KeyPress event, serial 33, synthetic NO, window 0x4000001,
root 0x1a0, subw 0x0, time 5359126, (246,560), root:(2233,640),
state 0x1, keycode 38 (keysym 0x41, A), same_screen YES,
XLookupString gives 1 bytes: (41) "A"
XmbLookupString gives 1 bytes: (41) "A"
XFilterEvent returns: False