HWND hMainWnd = NULL;
HINSTANCE hInst;
HHOOK hHook;
extern "C" __declspec(dllexport) LRESULT BlenderHook(int nCode, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) bool SetHook(bool bSet);
BOOL APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
hMainWnd = FindWindow(L"BlenderWnd", NULL);
hInst = hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern "C" __declspec(dllexport) LRESULT BlenderHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HCBT_CREATEWND)
{
if (hMainWnd)
SendMessage(hMainWnd, WM_USER + 103, wParam, NULL);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
extern "C" __declspec(dllexport) bool SetHook(bool bSet)
{
if (bSet)
{
hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)BlenderHook, hInst, 0);
if (hHook)
return true;
}
else
return UnhookWindowsHookEx(hHook);
return false;
}
Проблема с хуком WH_CBT
Мне нужно отлавливать хэндлы всех создаваемых в системе окон. Для этой цели использую глобальный хук WH_CBT. Вот код:
DLL:
Код:
BlenderHook - хуковая процедура, SetHook - ставит/снимает хук.
Основная прога:
Код:
typedef bool (*MyProc)(bool);
HMODULE hLib = NULL;
MyProc hProc = NULL;
HHOOK hHook = NULL;
...
hLib = LoadLibrary(L"BlenderHook.dll");
if (!hLib)
MessageBox(L"Не удалось загрузить библиотеку BlenderHook.dll. Где-то косяк :(", L"Косяк :(", MB_ICONHAND);
else
{
hProc = (MyProc)GetProcAddress(hLib, "SetHook");
if (!hProc)
MessageBox(L"Не удалось получить указатель на процедуру установки хука.", L"Косяк :(", MB_ICONHAND);
else
UIEnable(ID_ACTIVATE, true);
}
...
if (!hProc(true))
{
MessageBox(L"Не удалось установить хук.", L"Косяк :(", MB_ICONHAND);
return 0;
}
HMODULE hLib = NULL;
MyProc hProc = NULL;
HHOOK hHook = NULL;
...
hLib = LoadLibrary(L"BlenderHook.dll");
if (!hLib)
MessageBox(L"Не удалось загрузить библиотеку BlenderHook.dll. Где-то косяк :(", L"Косяк :(", MB_ICONHAND);
else
{
hProc = (MyProc)GetProcAddress(hLib, "SetHook");
if (!hProc)
MessageBox(L"Не удалось получить указатель на процедуру установки хука.", L"Косяк :(", MB_ICONHAND);
else
UIEnable(ID_ACTIVATE, true);
}
...
if (!hProc(true))
{
MessageBox(L"Не удалось установить хук.", L"Косяк :(", MB_ICONHAND);
return 0;
}
Хук ставится нормально, то есть никаких ошибок не вылезает.
Для теста нажимаю "Пуск" (создаётся окно). Мессага в главную прогу не приходит, explorer.exe радостно падает :( Пытаюсь установить фокус на какое-нибудь окно - его процесс радостно падает :(
В чём, кроме ДНК, может быть проблема?
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
...
Первым параметром передаеться HANDLE хука, но никак не NULL.
2. Не используй SendMessage. Explorer будет падать по непонятным причинам. PostMessage тебе поможет.