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 usato per caricare la dll: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); }
Il codice è veramente semplice....helpcodice:#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; }![]()

