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.
y como vamos a adivinar si siquiera sabemos que hacen las funciones de tus .h,.cpp's
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.
Gracias por el code, lo probare + tarde, ahora no puedo, y mirare lo de Wayland.
Saludos ;D