Newsgroup: it.comp.programmare.win32
Titolo: HELP !!! Monitorare i caratteri della tastiera....

Vorrei realizzare una semplice applicazione che intercetti tutti i caratteri
della tastiera, qualsiasi sia l' applicazione attiva. Ho letto in precedenti
post che è necessario utilizzare
la funzione SetWindowsHookEx() richiamandola in una Dll. Avevo pensato di
realizzare
una semplice finestra, per la quale nel WM_CREATE caricare la Dll con la
funzione LoadLibrary e settare un timer, quindi nel WM_TIMER richiamare una
funzione generica WndProc(HWND hWnd, UINT msg, LPARAM lParam, WPARAM wParam)
nella quale gestire
l'evento WM_CHAR. Questa funzione WndProc() sarebbe il secondo parametro
della
SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD
wThreadId),
tuttavia sbaglio in qualcosa, infatti nn funziona.
Avete qualche suggerimento? o del codice d'esempio da mandarmi?
Grazie sin d'ora per qualsiasi suggerimento.
Alex
 
--------------------------------
Inviato via 
http://usenet.libero.it









 wrote in message
217Z57Z76Z97Y1...@usenet.libero.it...

Scusa, puoi ripetere? Non so se ho capito bene quello che vuoi...
Dan

Ho creato una semplice applicazione di cui ti mostro WndProc qui di seguito
:
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	TCHAR szHello[MAX_LOADSTRING];
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
	switch (msg)
	{
 
		case WM_CREATE:
			SetTimer(hWnd, 1, 1, NULL);
			hGlobalInst=LoadLibrary(TEXT("hkey.dll"));
		break;
		case WM_COMMAND:
			wmId = LOWORD(wParam);
			wmEvent = HIWORD(wParam);
			// Parse the menu selections:
			switch (wmId)
			{
				case IDM_ABOUT:
				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
				   break;
				case IDM_EXIT:
				   DestroyWindow(hWnd);
				   break;
				default:
				   return DefWindowProc(hWnd, msg, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			// TODO: Add any drawing code here...
			RECT rt;
			GetClientRect(hWnd, &rt);
			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
			EndPaint(hWnd, &ps);
			break;
		case WM_TIMER:
			KeyboardHookProc();
		break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, msg, wParam, lParam);
   }
   return 0;
}
mentre qui di seguito il codice della dll
#include "stdafx.h"
#include "hkey.h"
#include <stdio.h>
static HHOOK hKeyboardHook=0;
HWND hDlg=NULL;
HKEY_API LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM
lParam)
{
	const KEY_UP=0x80000000;
	const KEY_WAS_DOWN=0x40000000;
	if(nCode<0)
		return CallNextHookEx(hKeyboardHook,nCode,wParam,lParam);
	if(nCode==HC_ACTION)
	{
		if(!(lParam & KEY_WAS_DOWN))
		{
			MessaggeBox(...char catturato...)
		}
	}
	return CallNextHookEx(hKeyboardHook,nCode,wParam,lParam);
}
BOOL APIENTRY DllMain( HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID
lpReserved)
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
hKeyboardHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardHookProc,hModule,0);
 
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
 
		case DLL_PROCESS_DETACH: break;
    }
    return TRUE;
}
// This is an example of an exported variable
HKEY_API int nHkey=0;
// This is an example of an exported function.
HKEY_API int fnHkey(void)
{
	return 42;
}
// This is the constructor of a class that has been exported.
// see hkey.h for the class definition
CHkey::CHkey()
{
	return;
}
Purtroppo non capisco dove sbaglio, se l'hook lo settassi all'interno di una
DialogBox il giochino di catturare tutti
i tasti premuti (fintanto che che l'applicanzione che gestisce la Dialog Box
ha il focus) della tastiera funziona,al contrario se voglio catturare tutti
i tasti di tutti i thread nn funziona
nulla.
Hai qualche suggerimento?
Danke.



Ho creato una semplice applicazione di cui ti mostro la WndProc qui di
seguito :






	if(nCode<0)
		return CallNextHookEx(hKeyboardHook,nCode,wParam,lParam);






Hai qualche suggerimento?????
Danke.



No, mi dispiace :-(, ma io volevo dire solo che basta postare una volta.
Dan

 ha scritto nel messaggio
news:212Z171Z108Z79Y...@usenet.libero.it...

Ti ho appena spedito per posta un progetto che avevo fatto in vb6 che fa
propio quello che vuoi.
Ciao ciao,


 > Inviato via 
http://usenet.libero.it
Non mi è arrivato ancora nulla, puoi rispedirmelo?
Danke


