Имитация нажатия клавиш в консольном приложении Linux C - PullRequest
7 голосов
/ 11 августа 2009

Можно ли имитировать нажатие клавиш в Linux с помощью C?

В моей конкретной ситуации я нахожусь на Ubuntu 9.04 и мне нужно простое приложение, которое запускает нажатие кнопки «пауза» при запуске. Это позволило бы обновлять iframe в Firefox с использованием Javascript.

Ответы [ 2 ]

13 голосов
/ 11 августа 2009

Полагаю, вы имеете в виду «приложение X11» - из вашего описания не совсем понятно, что вы планируете делать. Приведенный ниже фрагмент кода отправит код «паузы» в приложение, которое в настоящее время имеет фокус ввода клавиатуры под 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 должен был сосредоточиться в то время.

Однако мне было бы любопытно узнать, какую большую задачу вы пытаетесь выполнить - я подозреваю, что должно быть более элегантное решение, чем подмена событий нажатия клавиш.

7 голосов
/ 29 декабря 2012

Есть программируемая библиотека под названием '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; 
}

Беги так:

gcc test.c -lxdo -o test

...