2009-08-11 10 views
7

Czy istnieje sposób symulacji naciśnięcia klawisza w systemie Linux przy użyciu C?Symulacja naciśnięcia klawisza w aplikacji konsoli Linux C

W mojej konkretnej sytuacji jestem na Ubuntu 9.04 i potrzebuję prostej aplikacji, która wywołuje naciśnięcie przycisku "pauza" po uruchomieniu. To dostanie element iframe w Firefoksie, aby odświeżyć JavaScript.

Odpowiedz

13

Zakładam, że masz na myśli "aplikację X11" - z twojego opisu nie do końca wiadomo, co planujesz zrobić. Poniższy fragment kodu wyśle ​​kod "pauza" do aplikacji, która aktualnie ma wejście klawiaturowe pod X11 przy użyciu rozszerzenia XTest - z tego co przeczytałem, jest to najbardziej zgodny sposób "fałszowania" zdarzeń klawiatury. Sprawdź, czy możesz zastosować to do swojego scenariusza (bez sprawdzania błędów, czy XOpenDisplay powiodło się, aby było prostsze).

#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); 

Będziesz musiał połączyć się z -lX11 -lXtst.

Oczywiście, w tym czasie firefox musiałby się skupić.

Jednak chciałbym wiedzieć, jakie jest większe zadanie, które próbujesz wykonać - podejrzewam, że powinno być bardziej eleganckie rozwiązanie niż fałszowanie zdarzeń związanych z naciśnięciem klawisza.

+1

strona komentarz o moim przypadku wykorzystania do powyższego kodu: musiałem mu OpenCV zasilany weekendowy hack, który pozwolił mi fałszywe, każde naciśnięcie klawisza strzałki przesuwając głowę przed kamery (tak mogę przewinąć the /. wysyłać posty i jeść kanapkę w tym samym czasie :-) –

+0

Chcę użyć powerarma gryf do przeładowania iframe :) – Baversjo

+0

Ah, więc to prawie takie samo użycie jak w moim przypadku :) –

6

Jest programowalny biblioteka o nazwie 'xdotool':

sudo apt-get install libxdo-dev libxdo2

kot 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 tak:

gcc test.c -lxdo -o Test