Archive for Maggio, 2008

C++, Source Code, Windows

Intercettare tasti in c++

Per intercettare la pressione dei tasti in c++, è sufficente “agganciarsi” agli eventi del sistema operativo tramite il metodo SetWindowsHookEx delle API di windows:

HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

Il parametro hook specifica a che tipo di eventi bisogna agganciarsi, il secondo parametro invece è il nome alla funzione da chiamare quando viene generato l’evento. Per ulteriori dettagli consultare la relativa voce su MSDN.

g_hKeyboardHook = SetWindowsHookEx (WH_KEYBOARD_LL,
	LowLevelKeyboardProc,
	hInstance, 0);

Nel nostro caso come hook settiamo la costante WH_KEYBOARD_LL per intercettare gli eventi generati dalla tastiera. Il metodo LowLevelKeyboardProc sarà quindi qualcosa del genere:

// hook per la tastiera
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
	// p->vkCode contiene il codice del tasto premuto

	if ((nCode == HC_ACTION) && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
	{
		// è stato premuto il tasto
	}

	if ((nCode == HC_ACTION) && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
 	{
 		// è stato rilasciato il tasto
 	}

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

A cosa può servire?
Nel mio caso l’ho usato per registrare tutte le pressioni della tastiera e del mouse per salvare una macro con le azioni eseguite, per poi farle rieseguire con lo stesso tempismo da un altro programmino (per poter svolgere azioni ripetitive). Tra l’altro se a qualcuno interessa un programma del genere, e mi arrivano abbastanza feedback, mi sa che pubblicherò i sorgenti e i binari. :)
Un’altra idea interessantemalvagia è quella di costruire dei keylogger per salvare tutto ciò che l’utente scrive.

Download C++ Intercept keyboard events. Downloads: 107

Quiz

Coders4fun Quiz #4

Main.java

public class Main {

  public static void main(String[] args) {
    System.out.print(Quiz.GetMagicNumber());
  }

}

Quiz.java

public class Quiz {

  static int magicNumber = 3;

  public static int GetMagicNumber()
  {
    return magicNumber;
  }
}

Che cosa bisogna aggiungere nella classe Quiz per far stampare 5 invece di 3?