Título: Porque no me funciona este codigo
Publicado por: 0xDani en 10 Junio 2012, 13:38 pm
Bueno sigo haciendo mi keylogger y me he metido con las Xlib, he hecho este codigo para que recoja los eventos del teclado y los guarde en un archivo, pero no me funciona,me abre el fichero pero esta vacio, si alguien me puede decir porque... Dejo el codigo: #include <X11/Xlib.h> #include <X11/Xutil.h> #include <stdio.h>
int main(){ bool bucle=true; FILE* fichero=fopen("string.txt", "a"); XEvent evento; Display* display=XOpenDisplay(NULL); Window ventana; int pantalla; unsigned long negro, blanco; pantalla=DefaultScreen(display); negro=BlackPixel(display, pantalla); blanco=WhitePixel(display, pantalla); ventana=XCreateSimpleWindow(display, DefaultRootWindow(display), 200, 200, 200, 200, 200, negro, blanco); XMapWindow(display, ventana); XSelectInput(display, ventana, KeyPressMask); XFlush(display); while (bucle==true){ XNextEvent(display, &evento); XFlush(display); switch (evento.type){ case KeyPress: {fputc(getc(stdin), fichero); fflush(fichero);} continue; default: continue; } } return 0; }
Saludos y gracias de antemano.
Título: Re: Porque no me funciona este codigo
Publicado por: x64core en 10 Junio 2012, 19:18 pm
y como vamos a adivinar si siquiera sabemos que hacen las funciones de tus .h,.cpp's
Título: Re: Porque no me funciona este codigo
Publicado por: Foxy Rider en 10 Junio 2012, 21:30 pm
Es una especie de xev, no? bueno, algo así sería el código estando más limpio ... #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <stdio.h> #include <stdlib.h> #define XBUFFER_SIZE 255 int main(int argc, char** argv) { Display* xDisplay; XEvent xEvent; Window xWindow; char xKeyBuffer[XBUFFER_SIZE]; unsigned long blackPixel, whitePixel; int xLoop = 1, xScreen; /* Abrimos el display y pantalla respectiva :0.0 ... sin verificar errores */ xDisplay = XOpenDisplay(0); xScreen = XDefaultScreen(xDisplay); /* Color */ blackPixel = BlackPixel(xDisplay,xScreen); whitePixel = WhitePixel(xDisplay,xScreen); /* Creamos la ventana (sin verificar errores, deberia) */ xWindow = XCreateSimpleWindow(xDisplay, DefaultRootWindow(xDisplay), 200, 200,200,200, 200, blackPixel, whitePixel ); /* Nos registramos para obtener el evento de "cerrado" de ventana .. idem, sin verificar, corrre por tu cuenta */ Atom wmDeleteMessage = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True); XSetWMProtocols(xDisplay, xWindow, &wmDeleteMessage, 1); XMapWindow(xDisplay,xWindow); XSelectInput(xDisplay,xWindow,KeyPressMask); /* Mientras no se cierre la ventana ...*/ do { XNextEvent(xDisplay,&xEvent); if (xEvent.type == KeyPress && XLookupString(&xEvent.xkey, xKeyBuffer, XBUFFER_SIZE, 0, 0 ) == 1 ) printf("Tecla presionada : %s !\r\n",xKeyBuffer ); if (xEvent.type == ClientMessage && xEvent.xclient.data.l[0] == wmDeleteMessage ) xLoop = 0; } while (xLoop); /* Destruimos ventana y display ... */ XDestroyWindow(xDisplay,xWindow); XCloseDisplay(xDisplay); return EXIT_SUCCESS; }
gcc -ansi -lX11 ../main.c -o myXev # o clang ./myXev
En términos generales y rudimentarios, así pedís el Input en X ... lo que estabas haciendo era mezclar funciones de consola (bloqueantes, y que toman el buffer de la consola) con las de X (no bloqueantes, y que toman el buffer de X por así decirlo). No te acostumbres mucho a X, usá algún toolkit en lo posible ... No sólo por que la API de X es fea e inestable, sino que también tiene los días contados ya que hay mucha presión de cambiar X a Wayland. Saludos.
Título: Re: Porque no me funciona este codigo
Publicado por: 0xDani en 11 Junio 2012, 00:40 am
Gracias por el code, lo probare + tarde, ahora no puedo, y mirare lo de Wayland.
Saludos ;D
|