Ciao ragazzi, ho un problema ad utilizzare le hook globali, mi sono letto bene tutta la documentazione e riguardo a come funzionano i messaggi di windows da quando leggo il petzold inizio a capirci abbastanza bene.

Comunuque...ho provato a fare una hook per il controllo della tastiera in una dll, in modo che abbia effetto su tutti i processi del desktop corrente.

Allora, il codice seguente l'ho scritto per i 9/10 io, dovrebbe caricare una hook per il controllo della tastiera e poi quando fiuta il VK_RETURN nel wParam (indipendentemente che il messaggio si WM_CHAR, WM_KEYDOWN, etc....) infatti è una hook molto grezza, comunque quando fiuta un VK_RETURN dovrebbe distruggersi......ma non lo fa!


Chiedo aiuto....il codice è molto semplice, posto anche il codice che ho usato per caricare la dll.

Compilatore VS 2010 express

codice:
#include "stdafx.h"
#include <windows.h>


HHOOK hHook;
HINSTANCE hInst;

//forward declaration
__declspec(dllexport) void Unhook();
__declspec(dllexport) BOOL SetHook(DWORD dwThreadId);

int DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID pReserved)
{
	
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		hInst = hInstance;
		SetHook(0);
		break;
	case DLL_PROCESS_DETACH:
		break;
	}

	return 1;
}



LRESULT CALLBACK KeyHookProcM(  int nCode,   WPARAM wParam,   LPARAM lParam)
{
	if(wParam == VK_RETURN)
		Unhook();

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


__declspec(dllexport) BOOL SetHook(DWORD dwThreadId)
{
	
	hHook = SetWindowsHookEx( WH_KEYBOARD, KeyHookProcM, hInst, dwThreadId );
	DWORD dwErr = GetLastError();
	if(hHook == NULL)
		{
		TCHAR szBox[100];
		wsprintf(szBox,L"Unable to create the hook\nerror code: %i",dwErr);
		MessageBox(NULL,szBox,L"Error",MB_ICONERROR);
		return 0;
		}
	//MessageBox(NULL,L"Hook created",L"Error",MB_ICONINFORMATION);
    return 1;
}

__declspec(dllexport) void Unhook()
{
	BOOL bRes = UnhookWindowsHookEx(hHook);

	if(!bRes)
	    MessageBox(NULL,L"Unable to delete the hook",L"Error",MB_ICONERROR);
	else
		MessageBox(NULL,L"Hook destroyed",L"Error",MB_ICONINFORMATION);
}
codice usato per caricare la dll:

codice:
#include "stdafx.h"
#include <windows.h>
					

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{

HMODULE hMod = LoadLibrary(L"Hook dll.dll"); 
//quando LoadLibrary viene chiamata parte la DllMain
DWORD dwErr= GetLastError();

	if(hMod == NULL)
		{
		TCHAR szBox[100];
		wsprintf(szBox,L"Unable to load the dll\nerror code: %i",dwErr);
		MessageBox(NULL,szBox,L"Error",MB_ICONERROR);
		return 1;
		}
return 0;
}
Il codice è veramente semplice....help