入力をキャプチャし、同時にキーイベントを送信します。

入力をキャプチャし、同時にキーイベントを送信します。

簡単な入力プログラムを作成したいと思います。現在の手動キーキャップを使用して、すべてのウィンドウで入力をキャプチャできます(ユーザーdirktに感謝!)。

また、送信ボタンを使用することもできますXTestFakeKeyEvent()

問題は、これら2つの部分を組み合わせることができないということです。偽のキーイベントが発生すると、フォーカスのある意図されたアプリケーションの代わりに私のプログラムがそれを受け取ります。私のプログラムが偽のイベントによって生成されたキーコードを手動でインポートできない場合でも、これが発生します。ルートウィンドウでイベントを受け取っているようですが、そうしないと他のウィンドウで入力をキャプチャできないようです。

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <X11/extensions/XTest.h>
#include <stdio.h>

int main()
{
    Display *display;
    Window   rootwindow;
    XEvent   event;

    display = XOpenDisplay(NULL);
    rootwindow = DefaultRootWindow(display);

    XSelectInput(display, rootwindow, KeyPressMask);    

    unsigned int modifiers[] = {
        0, 
        ShiftMask,
        LockMask, //capslock
        Mod2Mask, //numlock
        ShiftMask | LockMask,
        ShiftMask | Mod2Mask,
        LockMask | Mod2Mask,
        LockMask | Mod2Mask | ShiftMask,
    };

    int keys [] = {
        XKeysymToKeycode(display, XK_A),
        XKeysymToKeycode(display, XK_B),
        ...
        XKeysymToKeycode(display, XK_Z)
    };

    int l;
    int m;
    for(l = 0; l < sizeof(keys)/sizeof(int); l++){
        for(m = 0; m < sizeof(modifiers)/sizeof(unsigned int); m++){
            XGrabKey(display, keys[l], modifiers[m], rootwindow, False, GrabModeAsync, GrabModeAsync);
        }
    }

    int repeat = 0;

    while (1) {

        XNextEvent(display, &event);

        if (event.type == KeyPress && event.xkey.send_event == 0) {
            printf("KeyPress: keycode %u state %u send-event %d\n", event.xkey.keycode, event.xkey.state, event.xkey.send_event);
            fflush(stdout);

            if(repeat == 0){ //to avoid infinite loops
                repeat = 1;

                XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_7), 1, CurrentTime);
                XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_7), 0, CurrentTime);
            }

        }
    }

    XCloseDisplay(display);
    return 0;
}

ベストアンサー1

おすすめ記事