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