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
映射到与keycode
29
相对应的物理键,但此虚拟按键将产生的字符取决于mate中的布局列表。如果我只启用了德语布局,它将生成一个
y
,如果我的列表中德语多于德语,但德语处于活动状态,它将生成一个
z
Xkb,或者可能您的DE使用两种不同的机制来重新映射键盘,具体取决于您是否启用了一个或多个布局。对于一个布局,它将替换键码,而对于许多布局,它将单独保留键码,并使用不同的键码到键码映射。或者这是我目前的理解。不管怎样,我提出的解决方案应该是可行的。