2009-08-11 65 views
7

有没有什么方法可以在Linux中使用C来模拟按键?在Linux C控制台应用程序中模拟按键

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

回答

13

我假定你的意思是“X11应用程序” - 从你的描述中不完全清楚你打算做什么。下面的代码片段将使用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当时需要关注焦点。

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

+1

关于我自己用于上述代码的使用案例的旁注:我使用了OpenCV支持的周末黑客,让我通过在摄像头前移动头部来伪造箭头按键(所以我可以滚动/。帖子和同时吃三明治:-) – 2009-08-11 20:04:53

+0

我想用griffin powermate重新加载一个iframe :) – Baversjo 2009-08-11 20:45:03

+0

啊,所以它几乎和我的情况一样:) – 2009-08-11 20:51:31

6

有一个叫 'xdotool' 可编程库:

命令和apt-get安装libxdo-dev的libxdo2

猫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; 
} 

像这样运行:

gcc test.c -lxdo -o test