Input XTest:XTestFakeKeyEvent根据单个或多个布局的不同行为
关于Input XTest:XTestFakeKeyEvent根据单个或多个布局的不同行为,input,keyboard,x11,Input,Keyboard,X11,关于XTestFakeKeyEvent我有一个小问题,我编写了这个示例程序来演示这个问题: #include <stdio.h> #include <stdlib.h> #include <X11/X.h> #include <X11/XKBlib.h> #include <X11/extensions/XTest.h> #include <unistd.h> int main(int argc, const char *
XTestFakeKeyEvent
我有一个小问题,我编写了这个示例程序来演示这个问题:
#include <stdio.h>
#include <stdlib.h>
#include <X11/X.h>
#include <X11/XKBlib.h>
#include <X11/extensions/XTest.h>
#include <unistd.h>
int main(int argc, const char * argv[]) {
Display * display;
//Try to attach to the default X11 display.
display = XOpenDisplay(NULL);
if(display == NULL) {
printf("Error: Could not open display!\n");
return EXIT_FAILURE;
}
KeyCode inject = 29; // Should be XKB_KEY_Y
sleep(10);
XTestFakeKeyEvent(display, inject, True, 0);
XTestFakeKeyEvent(display, inject, False, 0);
XFlush(display);
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,const char*argv[]{
显示*显示;
//尝试连接到默认的X11显示器。
display=XOpenDisplay(空);
如果(显示==NULL){
printf(“错误:无法打开显示!\n”);
返回退出失败;
}
KeyCode inject=29;//应该是XKB\u KEY\Y
睡眠(10);
XTestFakeKeyEvent(显示、注入、真、0);
XTestFakeKeyEvent(显示、注入、假、0);
XFlush(显示);
返回0;
}
编译时使用:gcc-oxkb\u test xkb\u test.c-lX11-lXtst
此程序的作用:它连接到X11服务器,等待10秒钟,然后在键盘上注入键码29
,对应于美国键盘上的y
键
现在的问题是:我有一个德国键盘布局(与我们相比,例如z和y是切换的),该程序将根据以下条件注入y
或z
:
当我在MATE中配置了多个布局时,z
被注入(因此我在状态栏中有这个布局切换小程序)
当我在MATE中只配置了一个布局时,会在中注入y
为什么会有不同的表现?如何激发一致的行为?
xtestfakekekeyevent
接受密钥码。键码对应于物理键,而不是映射到物理键的字符。如果要发送字符,需要确定它在当前布局中映射到哪个键
在现代系统中,您可能会使用Xkb,而与Xkb一起使用的布局称为组。您可以使用XkbGetState
在XkbStateRec
中获取当前组,然后逐个翻译有效的键码,直到获得所需的键码
用Xkb翻译密钥代码可能有点令人畏惧,我不知道有什么简单的防弹方法。有一个工作例程,它唯一缺少的就是组(它使用group=0
,您需要将其替换为state.group
,其中state
是您从XkbGetState
获得的)
注意:最终发送的符号取决于当前的移位和大写锁定状态。如果您需要特定的字符大小写,则必须在注入键盘代码之前修改键盘状态。我知道这一点,感谢您提供的精确信息。在我的例子中,
z
映射到与keycode29
相对应的物理键,但此虚拟按键将产生的字符取决于mate中的布局列表。如果我只启用了德语布局,它将生成一个y
,如果我的列表中德语多于德语,但德语处于活动状态,它将生成一个z
Xkb,或者可能您的DE使用两种不同的机制来重新映射键盘,具体取决于您是否启用了一个或多个布局。对于一个布局,它将替换键码,而对于许多布局,它将单独保留键码,并使用不同的键码到键码映射。或者这是我目前的理解。不管怎样,我提出的解决方案应该是可行的。