¿Hay alguna forma de simular una pulsación de tecla en Linux usando C?
En mi situación específica, estoy en Ubuntu 9.04 y necesito una aplicación simple que invoque presionar el botón “pausa” cuando se inicie. Eso obtendría un iframe en Firefox para actualizar usando Javascript.
Supongo que te refieres a la “aplicación X11”: no está del todo claro en tu descripción lo que planeas hacer. El siguiente fragmento de código enviará el código clave de “pausa” a la aplicación que actualmente tiene el foco de entrada del teclado en X11 usando la extensión XTest; por lo que he leído, esta es la forma más compatible de “falsificar” los eventos del teclado. Vea si puede aplicar esto a su escenario (no hay verificación de error sobre si XOpenDisplay tuvo éxito, para hacerlo más simple).
#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);
Deberá vincular con -lX11 -lXtst.
Obviamente, Firefox necesitaría tener el foco en ese momento.
Sin embargo, tengo curiosidad por saber cuál es la tarea más grande que está tratando de lograr; sospecho que debería haber una solución más elegante que falsificar los eventos de pulsación de tecla.
Hay una biblioteca programable llamada ‘xdotool’:
sudo apt-get install libxdo-dev libxdo2
prueba de gato.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;
}
Corre así:
gcc prueba.c -lxdo -o prueba