【问题标题】:al sending fake keyboard events, whitespace issuesal 发送假键盘事件,空格问题
【发布时间】:2015-06-24 10:54:20
【问题描述】:

我正在创建一个使用 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',它无法处理空格或任何特殊字符

谢谢

【问题讨论】:

  • temp[1]='\0' 是未定义的行为。 temp 只有一个单元格,temp[0]。您拥有越界访问权限。
  • 我已将数组大小增加到 2,仍然得到相同的结果 :(

标签: c linux gtk xlib


【解决方案1】:
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](如示例中所示)。

【讨论】:

  • 好的,2 分 - 1. 你为什么要调用 XTestFakeKeyEvent 三次?它应该在 XFlush 之后立即发送密钥代码。 2. 可以打印 XKeysymToKeycode 为空格生成的 modcode 吗?
  • 你说得对,我绝对不需要所有这些冲洗,我能够删除一个 Xtestfake...,但是我需要 2 个,一个用于按键,另一个用于按键释放, 字符串打印不正确如何打印模式码?
  • 好吧,据我所知,键码只是 8-255 之间的一个数字。尝试使用直接 printf。如果这不起作用,请查看 KeyCode 的定义并在此处使用字段进行注释
  • 好的,这就是我得到的:43 26 46 46 32 204 25 32 27 46 40 204 h e l l o ' ' w o r l d 终止符和空格具有相同的值,这是正常的吗?
  • 我还尝试了一些特殊字符,例如!和 % 我得到 204 这些字符应该在哪里
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多