2009-08-11 182 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