使用xlib将伪造的按键事件发送到窗口

时间:2015-05-23 13:33:37

标签: c linux xlib

我正在尝试使用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;
}

反复按下一个键,如果我不使用睡眠功能,我无法释放该按钮,我无法输入一次该字母,然后释放按键

2 个答案:

答案 0 :(得分:0)

这看起来很像Linux上的一个例子(没有回答)问题: XLib problem (XSendEvent)

除了显而易见的(没有错误检查),或许看看其他人如何解决问题会给出一些提示:

答案 1 :(得分:0)

得到它,不确定这是否是正确的方法,但它完成了工作: 在按键修正所有内容之前的关键版本

#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;
        char hello[]="hello";
        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&#39; a&#39;