Knowledge Base Nr: 00129 kbstick.c - http://www.swe-kaiser.de

Linux: Tastendrücke unter X simulieren/schicken

  
//g++ kbstick.c -o kbstick -lncurses -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lXtst

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <unistd.h>

#include <X11/Xlib.h>
#include <X11/extensions/XTest.h>
#include <X11/keysym.h>

#include <signal.h>

Display* ourXDisplay = 0;

const int delayForSend = 10; /* Delay in mSec for sending key msgs */


Display* getXDisplay(const char* appName) {

int ourEvent, ourError, ourMajor, ourMinor;

Display* ourDisplay = XOpenDisplay(0);

if (! ourDisplay) {
printf("\n ERROR: This program is made to be run in X Windows.\n\n");
exit(1);
}
if (! XTestQueryExtension(ourDisplay, &ourEvent, &ourError, &ourMajor, &ourMinor) ) {
printf("%s: ", appName);
printf("XServer %s doesn't support the Xtest extensions we need...\n", DisplayString(ourDisplay));
XCloseDisplay(ourDisplay);
exit(1);
}
printf("\nServer %s supports XTest (version %d.%d). Good.\n\n", DisplayString(ourDisplay), ourMajor, ourMinor);

XSync( ourDisplay, True);

return ourDisplay;
}


void doXKey(Display* ourDisplay, const int keyToSend)
{
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, True, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, False, delayForSend);
}


void doShiftXKey(Display* ourDisplay, const int keyToSend)
{
XTestFakeKeyEvent(ourDisplay, (unsigned int)63, True, delayForSend); //Shift_L
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, True, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, False, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)63, False, delayForSend); //Shift_L
}


void doAltXKey(Display* ourDisplay, const int keyToSend)
{
XTestFakeKeyEvent(ourDisplay, (unsigned int)77, True, delayForSend); //Alt_L
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, True, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, False, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)77, False, delayForSend); //Alt_L
}


void doCtrlXKey(Display* ourDisplay, const int keyToSend)
{
XTestFakeKeyEvent(ourDisplay, (unsigned int)76, True, delayForSend); //Control_L
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, True, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)keyToSend, False, delayForSend);
XTestFakeKeyEvent(ourDisplay, (unsigned int)76, False, delayForSend); //Control_L
}


void cleanup(const int signal)
{
XCloseDisplay(ourXDisplay);
printf("\nExiting on signal.\n");
exit(0);
}


int main(int argc, char *argv[])
{
printf("\nKBStick v0.7 GPL (c) 2000 by David A. Fulgham\n");

ourXDisplay = getXDisplay(argv[0]);

signal(SIGINT, cleanup);
signal(SIGTERM, cleanup);

sleep(2);

char szKeysym[50];

strcpy(szKeysym, argv[1]);

KeyCode kc;
KeySym ks;

ks = XStringToKeysym(szKeysym);
if( ks == NoSymbol )
{
printf("Unable to resolve keysym for '%s'\n", szKeysym);
exit (0);
}

kc = XKeysymToKeycode(ourXDisplay, ks );
printf("String '%s' maps to keysym '%d'\n", szKeysym, ks );
printf("String '%s' maps to keycode '%d'\n", szKeysym, kc );

//doXKey(ourXDisplay, kc);
//doShiftXKey(ourXDisplay, kc);
//doAltXKey(ourXDisplay, kc);

doCtrlXKey(ourXDisplay, kc);

// doXKey(ourXDisplay, XK_B);
// doXKey(ourXDisplay, XK_Z);
// doXKey(ourXDisplay, XK_0);
// doXKey(ourXDisplay, XK_1);
// doXKey(ourXDisplay, XK_9);
// doXKey(ourXDisplay, XK_F1);

sleep(2);

XCloseDisplay(ourXDisplay);

printf("\nExiting normally.\n\n");
exit(0);
}