2

我有以下问题:

  • 我正在尝试将假键事件发送到 X 服务器。

为此,我知道两种方法:

  • XSendEvent - 我用 XK_Z 而不是 XK_Down 尝试了本教程
    • 不适用于 GTK3
  • XTestFakeKeyEvent - 请参阅下面的代码

我的问题是,这种方法都没有考虑到键盘映射。我的意思是,当我选择 AZERTY 映射时,我有一个“z”字符,正如我所期望的那样,当我选择 QWERTY 映射时,我得到一个“w”,而我心爱的 BÉPO 映射我得到一个“é”。

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

我在 Unity 下使用 Ubuntu 12.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;
}
4

1 回答 1

0

使用XChangeKeyboardMappingAPI 将 unicode Keysym 绑定到未使用的 Keycode。

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

未经测试,但似乎可以根据此评论工作。

于 2013-08-22T09:29:53.790 回答