Keyboard XKeysymToKeycode、XTestFakeKeyEvent和映射

Keyboard XKeysymToKeycode、XTestFakeKeyEvent和映射,keyboard,xorg,Keyboard,Xorg,我有以下问题: 我正在尝试向X服务器发送假密钥事件 为此,我知道两种方法: XSendEvent-我用XK_Z而不是XK_Down尝试了这个 不适用于GTK3 XTestFakeKeyEvent-请参阅下面的我的代码 我的问题是,这些方法都没有考虑键盘映射。我的意思是,当我选择AZERTY映射时,我有一个我期望的“z”字符,当我选择QWERTY映射时,我得到一个“w”,而我心爱的BÉPO映射则得到一个“é” 如何独立于键盘映射获得相同的字符 我正在Unity下使用Ubuntu12.1

我有以下问题:

  • 我正在尝试向X服务器发送假密钥事件
为此,我知道两种方法:

  • XSendEvent-我用XK_Z而不是XK_Down尝试了这个
    • 不适用于GTK3
  • XTestFakeKeyEvent-请参阅下面的我的代码
我的问题是,这些方法都没有考虑键盘映射。我的意思是,当我选择AZERTY映射时,我有一个我期望的“z”字符,当我选择QWERTY映射时,我得到一个“w”,而我心爱的BÉPO映射则得到一个“é”

如何独立于键盘映射获得相同的字符

我正在Unity下使用Ubuntu12.10

这里是我的XTestFakeKeyEvent代码:

#include <X11/Xutil.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
#include <iostream>
// The key code to be sent.
// A full list of available codes can be found in /usr/include/X11/keysymdef.h
/* g++ -o XFakeKey tst.c -L/usr/X11R6/lib -lX11 -lXtst */

char *text = "z";
main()
{
// Obtain the X11 display.
  Display *display = XOpenDisplay(0);
  if(display == NULL)
    return -1;

  Window focusWindow;
  int revert;
  XGetInputFocus(display, &focusWindow, &revert);
  KeyCode code = XKeysymToKeycode(display, XStringToKeysym(text));

  XTestFakeKeyEvent(display, code, True, CurrentTime);
  XTestFakeKeyEvent(display, code, False, CurrentTime);

  XCloseDisplay(display);
  return 0;
}
#包括
#包括
#包括
#包括
//要发送的密钥代码。
//可用代码的完整列表可在/usr/include/X11/keysymdef.h中找到
/*g++-o XFakeKey tst.c-L/usr/X11R6/lib-lX11-lXtst*/
char*text=“z”;
main()
{
//获取X11显示。
Display*Display=XOpenDisplay(0);
如果(显示==NULL)
返回-1;
窗口焦点窗口;
int还原;
XGetInputFocus(显示、聚焦窗口和还原);
KeyCode code=XKeysymToKeycode(显示,XStringToKeysym(文本));
XTestFakeKeyEvent(显示、代码、真值、当前时间);
XTestFakeKeyEvent(显示、代码、错误、当前时间);
XCloseDisplay(显示);
返回0;
}

使用
XChangeKeyboardMapping
API将unicode键符号绑定到未使用的键代码

然后,发送重新映射的键码(使用
XTestFakeKeyEvent
XSendEvent
),使用
xkeycodetokesym
的应用程序将获得您想要的符号,与当前键盘/IME无关

未经测试,但似乎按照标准工作