使用xlib向窗口发送虚假按键事件

7

我试图使用C语言和xlib库向当前焦点窗口发送一个虚拟键盘按键事件,以下是我的代码:

#include <X11/Xlib.h>
#include <X11/keysymdef.h>
#define XK_A            0x041

int main()
{
        Display *display = XOpenDisplay(NULL);
        //find out window with current focus:
        Window winfocus;
        int    revert;
        XGetInputFocus(display, &winfocus, &revert);

        //send key event to taht window
        KeySym sym;
        sym=XStringToKeysym("a");
        //event definition
        XKeyEvent event;
        event.type=KeyPress;
        event.keycode=XK_A;
        event.display=display;
        event.root=winfocus;
        XSendEvent(display,winfocus,True,KeyPressMask,(XEvent *)&event);

        return 0;
}

我希望尽可能保持代码简单,我想要发送字母A到活动窗口,但我认为我做错了什么。
谢谢。
我尝试了以下代码:
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
#include <unistd.h>


int main()
{
        Display *dis;
        dis = XOpenDisplay(NULL);
        KeyCode modcode = 0; //init value
        modcode = XKeysymToKeycode(dis, XK_B);
        XTestFakeKeyEvent(dis, modcode, True, 0);
        XFlush(dis);
        sleep(1);
        XTestFakeKeyEvent(dis, modcode, False, 0);
        XFlush(dis);
        modcode = XKeysymToKeycode(dis, XK_A);
        XTestFakeKeyEvent(dis, modcode, True, 0);
        XFlush(dis);




        return 0;
}

如果我想要重复按下一个键(比如a键),如果我不使用sleep函数,我无法释放该键,也无法只按一次并释放该按键。

2个回答

2

我知道了。我不确定这是否是正确的做法,但是它完成了工作。在keypress之前进行键释放可以解决所有问题。

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


int main() {
        Display *dis;
        dis = XOpenDisplay(NULL);
        KeyCode modcode = 0; //init value
        int i;
        for (i=0;i<5;i++) {
                modcode = XKeysymToKeycode(dis, XStringToKeysym("a"));
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
                sleep(1);
                XTestFakeKeyEvent(dis, modcode, True, 0);
                XFlush(dis);
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
        }
        return 0;
}

这将输入5个“a”。


2
hello 在哪里被使用了? - lolololol ol

1

感谢提供linEAK的链接和XSync提示。它很有效。其他链接已失效。 - Kingsley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接