【问题标题】:Simulate keypress in a Linux C console application在 Linux C 控制台应用程序中模拟按键
【发布时间】:2010-11-18 17:43:09
【问题描述】:

有没有办法在 Linux 中使用 C 模拟按键?

在我的具体情况下,我使用的是 Ubuntu 9.04,需要一个简单的应用程序,在启动时调用“暂停”按钮。这将使 Firefox 中的 iframe 使用 Javascript 刷新。

【问题讨论】:

    标签: c linux x11 keypress


    【解决方案1】:

    我假设您的意思是“X11 应用程序” - 从您的描述中并不完全清楚您打算做什么。下面的代码 sn-p 将使用 XTest 扩展将“暂停”键码发送到当前在 X11 下具有键盘输入焦点的应用程序 - 据我所知,这是“伪造”键盘事件的最兼容方式。看看你是否可以将它应用到你的场景中(不对 XOpenDisplay 是否成功进行错误检查,以使其更简单)。

    #include <X11/Xlib.h>
    #include <X11/keysym.h>
    #include <X11/extensions/XTest.h>
    ...
    Display *display;
    unsigned int keycode;
    display = XOpenDisplay(NULL);
    ...
    keycode = XKeysymToKeycode(display, XK_Pause);
    XTestFakeKeyEvent(display, keycode, True, 0);
    XTestFakeKeyEvent(display, keycode, False, 0);
    XFlush(display);
    

    您需要使用 -lX11 -lXtst 链接。

    很明显,firefox 需要在那个时候获得焦点。

    但是,我很想知道您要完成的更大任务是什么 - 我怀疑应该有比欺骗按键事件更优雅的解决方案。

    【讨论】:

    • 对我自己的上述代码用例的旁注:我有一个 OpenCV 驱动的周末黑客,它允许我通过在网络摄像头前移动我的头来伪造箭头按键(所以我可以滚动/. 同时发帖和吃三明治 :-)
    • 我想使用 griffin powermate 重新加载 iframe :)
    • 啊,和我的用法差不多:)
    【解决方案2】:

    有一个名为“xdotool”的可编程库:

    sudo apt-get install libxdo-dev libxdo2

    猫测试.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <xdo.h>
    #include <unistd.h>
    int main() {
        xdo_t * x = xdo_new(":0.0");
    
        while(1) {
            printf("simulating Shift_L keypress\n");
            xdo_keysequence(x, CURRENTWINDOW, "Shift_L", 0);
            sleep(5);
        }
    
            return 0; 
    }
    

    像这样运行:

    gcc test.c -lxdo -o 测试

    【讨论】:

    • 您有文档链接吗?我找不到 xdotool 的编程部分的任何内容。
    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 2018-04-06
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多