2

次の問題があります。

  • 偽のキー イベントを X サーバーに送信しようとしています。

これを行うには、次の 2 つの方法を知っています。

私の問題は、この方法のどれもキーボードマッピングを考慮していないことです。つまり、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

API を使用してXChangeKeyboardMapping、Unicode Keysym を未使用の Keycode にバインドします。

次に、リマップされたキーコードを (XTestFakeKeyEventまたはを使用しXSendEventて) 送信すると、使用するアプリケーションXKeycodeToKeysymは、現在のキーボード/IME に関係なく、目的のシンボルを取得します。

テストされていませんが、このコメントに従って動作するようです。

于 2013-08-22T09:29:53.790 に答える