2

我目前正在尝试创建一个小的 C/C++ 程序,它模拟一个多媒体键(例如“暂停/播放”)上的按键。

为了模拟按键,我使用了-library 中的XTestFakeKeyEvent-function 。X11我在 SO 上找到了一个工作示例:Simulate keypress in a Linux C console application

我的问题是,我打算模拟的那些特殊键在keysymdef.h-file 中找不到,其中XKeysymToKeycode定义了使用的 -function 的常量。

所以,我做了一点研究,发现了这篇文章,它把我带到了xmodmap-command。使用xmodmap -pk我得到了一个包含这些键的列表:

KeyCode Keysym (Keysym) ...
Value   Value   (Name)  ...
[...]
171     0x1008ff17 (XF86AudioNext)  0x0000 (NoSymbol)   0x1008ff17 (XF86AudioNext)  
172     0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 
173     0x1008ff16 (XF86AudioPrev)  0x0000 (NoSymbol)   0x1008ff16 (XF86AudioPrev)  
174     0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  
[...]

使用这些定义的值(如172播放/暂停)作为 -function 的键码,XTestFakeKeyEvent我让它工作:

// Simulate Key-Press:
Display *display;
display = XOpenDisplay(NULL);

XTestFakeKeyEvent(display, 172, true, 0);
XTestFakeKeyEvent(display, 172, false, 0);
XFlush(display);

现在,我的问题是:

我可以依靠这些值(整数)映射到每个 linux 系统上的这些键吗?如果不是(这是我的猜测),那么动态(在代码中)获取正确映射的正确方法是什么?

4

1 回答 1

2

我知道这不是一个确定的答案,但根据我的经验(有一个类似的项目),我尝试过的每台 Linux 机器上的键映射都是相同的。这仅在具有 EN/US 键盘布局的机器上出现。我不能谈论具有替代布局的键盘。

如果这不能完全回答您的问题,我很抱歉。

编辑:

我实际上查看了我的旧项目,看起来我使用这些函数来获取实际的键码:

XStringToKeysym()
XKeysymToKeycode()

看看 MAN 页面,它们是非常不言自明的。

我希望这有帮助:)

于 2011-12-01T03:18:18.787 回答