我在GUI应用程序中设置了一个钩子。我想用WH_CBT钩子捕获WM_DESTROY消息,但它似乎不起作用。
...
HWND ghWnd = NULL;
HHOOK ghHook = NULL;
...
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
...
SetHook();
....
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
...
}
...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
case WM_DESTROY:
UnHook();
PostQuitMessage(0);
break;
...
}
LRESULT WINAPI HookProc(int Id, DWORD wParam, DWORD lParam)
{
if ( Id == WM_DESTROY )
{
MessageBoxA(NULL, "I got it", NULL, 0);
}
return CallNextHookEx(ghHook, Id, wParam, lParam);
}
void SetHook()
{
ghHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProc, hInst, GetCurrentThreadId());
if ( ghHook != NULL )
MessageBox(ghWnd, L"Hooked", L"Hook!", 0 );
else
MessageBox(ghWnd, L"Unable to hook", L"Hook!", 0 );
}
void UnHook()
{
if ( ghHook != NULL )
{
UnhookWindowsHookEx(ghHook);
MessageBoxA(ghWnd, "Unhooked", NULL, 0);
}
}
当我运行应用程序时,我看到了消息" Hooked"和#34; UnHooked"当我点击X按钮(窗口右上角的X符号)时。
但是我错过了HookProc功能中的信息。
有人可以向我解释原因吗?
答案 0 :(得分:1)
Read the documentation。 Id
挂钩回调中的WH_CBT
永远不会为WM_DESTROY
。当一个窗口即将被销毁时,Id
将改为HCBT_DESTROYWND
。
如果您想捕获实际的WM_DESTROY
消息,请使用WH_CALLWNDPROC
挂钩。