发送假键盘事件,空白问题

时间:2015-06-24 10:54:20

标签: c linux gtk xlib

我正在使用gtk和xlib(xtst)创建一个程序来向应用程序发送假按键,我创建了这个循环以将按键发送到活动窗口:

Display *dis;
        dis = XOpenDisplay(NULL);
        KeyCode modcode = 0; //init value
        int i;
        char hello[]="hello world";
        char temp[1];
        int size=sizeof(hello);
        sleep(2);
        for (i=0;i<size;i++)
        {
                temp[0]=hello[i];
                temp[1]='\0';     //string terminator
                g_print("%s\n",temp);  //works fine, whitespace is printed
                modcode = XKeysymToKeycode(dis, XStringToKeysym(temp));
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
        //      sleep(1);
                XTestFakeKeyEvent(dis, modcode, True, 0);
                XFlush(dis);
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
}

问题是它打印'helloworld'而不是处理空格或任何特殊字符

感谢

2 个答案:

答案 0 :(得分:0)

Display *dis;
        dis = XOpenDisplay(NULL);
        KeyCode modcode = 0; //init value
        int i;
        char hello[]="hello world";
        char temp[2]; //Size is 2!!!
        int size=sizeof(hello);
        sleep(2);
        for (i=0;i<size;i++)
        {
                temp[0]=hello[i];
                temp[1]='\0';     //string terminator
                g_print("%s\n",temp);  //works fine, whitespace is printed
                if (temp[0] == ' ')
                    modcode = XK_KP_Space
                else
                    modcode = XKeysymToKeycode(dis, XStringToKeysym(temp));
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
        //      sleep(1);
                XTestFakeKeyEvent(dis, modcode, True, 0);
                XFlush(dis);
                XTestFakeKeyEvent(dis, modcode, False, 0);
                XFlush(dis);
}

您将2个值存储到单个值数组中。将temp [1]更改为temp [2](如示例中所示)。

答案 1 :(得分:0)

我刚刚按照你的建议创建了我自己的翻译功能:

switch (hello[i])
{
case ' ':
XTestFakeKeyEvent(dis, 65, True, 0);
XTestFakeKeyEvent(dis, 65, False, 0);

对于大写字母,我使用了常规键的Shift键:

case 'T':
XTestFakeKeyEvent(dis, 50, True, 0);
XTestFakeKeyEvent(dis, 28, True, 0);
XTestFakeKeyEvent(dis, 28, False, 0);
XTestFakeKeyEvent(dis, 50, False, 0);
break;

和特殊字符:

case '\n':
XTestFakeKeyEvent(dis, 36, True, 0);
XTestFakeKeyEvent(dis, 36, False, 0);
break;

现在情况正常,谢谢Ishay