Porque no me funciona este codigo

Iniciado por 0xDani, 10 Junio 2012, 13:38 PM

0 Miembros y 1 Visitante están viendo este tema.

0xDani

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

x64core

y como vamos a adivinar si siquiera sabemos que hacen las funciones de tus .h,.cpp's

Foxy Rider

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;
}




Código (bash) [Seleccionar]
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.

0xDani

Gracias por el code, lo probare + tarde, ahora no puedo, y mirare lo de Wayland.

Saludos ;D
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM