在Linux C控制台应用程序中模拟按键操作

8

有没有办法在Linux上使用C语言模拟按键?

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

2个回答

14
我猜你是指“X11应用程序”,从你的描述中并不完全清楚你打算做什么。以下代码片段将使用XTest扩展向当前具有键盘输入焦点的应用程序发送“暂停”按键码-根据我所读的,这是模拟键盘事件最兼容的方式。看看你是否可以将其应用于你的场景(为了简单起见,没有对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需要拥有焦点。
不过,我很想知道您试图完成的更大任务是什么——我怀疑应该有比欺骗按键事件更优雅的解决方案。

2
关于上面代码的一些个人使用情况的侧注:我曾经用它进行了一个基于OpenCV的周末黑客马拉松,通过在网络摄像头前移动我的头部来模拟箭头按键(这样我就可以同时滚动/.帖子和吃三明治 :-))。 - Andrew Y
我想使用Griffin PowerMate重新加载iframe :) - Baversjo
啊,所以用法和我的情况差不多呢 :) - Andrew Y

7

有一款可编程的库叫做“xdotool”:

sudo apt-get install libxdo-dev libxdo2

cat test.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; 
}

Run like this:

gcc test.c -lxdo -o test


你有文档的链接吗?我找不到xdotool编程部分的任何内容。 - Shambhav Gautam
@ShambhavGautam 这个库没有好的文档。唯一的例子似乎都使用 CURRENTWINDOW,没有一个例子展示如何搜索窗口。我的意思是,现有的文档非常不完整。例如,max_depth - 搜索深度。1 表示只搜索顶层窗口。嗯,其他值是什么?为什么我们看到人们使用 -1?他们怎么知道它是做什么的或者它甚至存在?很遗憾,这个库已经投入了这么多的工作,但人们却浪费时间搜索不存在/非常不完整的文档。 - Deanie
@Deanie 老实说,这是C和C++整个领域的一个大问题。 - Shambhav Gautam
@ShambhavGautam 如果没有适当的文档,你怎么能知道这个呢?C语言从70年代就存在了,而文档使其仍然可用。这只是展示了某些程序员真正的懒惰。那些会编程的人会去做,那些不会的人则在文档编写方面遇到问题。libxdo有着如此巨大的潜力,我猜我只是对创作者无法意识到文档和代码同样重要感到失望! - Deanie
@Deanie 有时候,你必须完成某项工作并使用某个库。没有绕过它的方法,然后你会遇到缺乏文档的问题。这就是了!生态系统中的一个部分未被记录,一切都会崩溃。这也可能导致依赖关系的问题。 - Shambhav Gautam

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