在win32中挂钩
Posted
技术标签:
【中文标题】在win32中挂钩【英文标题】:Hooking in win32 【发布时间】:2009-05-04 05:37:02 【问题描述】:我希望任何窗口在鼠标悬停在其非客户区的关闭按钮上时立即关闭。我尝试在 SetWindowsHookEx 中使用 WH_GETMESSAGE 捕获 wm_ncmousemove,然后 使用 SendMessage 向指定窗口发送 WM_DESTROY 消息,但窗口未关闭。有什么帮助????
LRESULT CALLBACK CallWndProc(int code, WPARAM wParam, LPARAM lParam)
MSG* msg = (MSG*) lParam;
if(code == HC_ACTION)
if(msg->message == WM_NCMOUSEMOVE)
if(msg->wParam == HTCLOSE)
SendMessage(hwndTarget, WM_DESTROY, wParam, lParam);
return CallNextHookEx(g_hkMsg, code, wParam, lParam);
INT WINAPI InstallW(HWND hwnd, HINSTANCE hInstance, LPWSTR lpCmdLine, int nCmdShow)
DWORD dwTarget = 0;
POINT point;
GetCursorPos(&point);
hwndTarget = WindowFromPoint(point);
dwTarget = GetWindowThreadProcessId(hwndTarget, NULL);
g_hkMsg = SetWindowsHookEx(WH_GETMESSAGE, CallWndProc, g_hInstance, 0);
if(g_hkMsg)
MessageBox(NULL, L"Message hook installed, press OK to uninstall.", L"HLHookTest", MB_ICONEXCLAMATION);
UnhookWindowsHookEx(g_hkMsg);
else
MessageBox(NULL, L"Hook installation failed.", L"HLHookTest", MB_ICONERROR);
return 0;
【问题讨论】:
【参考方案1】:使用wParam=SC_CLOSE
代替WM_CLOSE
或WM_SYSCOMMAND
。
WM_CLOSE
和 WM_SYSCOMMAND / SC_CLOSE
要求关闭窗口。 WM_DESTROY
通知窗口它已关闭。对窗口说“您已关闭”不会使其关闭。
【讨论】:
但是当鼠标指针悬停在程序消息框的关闭按钮上时,这只会关闭命令提示符 @Neal:查看我的扩展答案。是的,它会关闭您将鼠标移到其关闭按钮的窗口,这就是您所要求的。如果你想关闭整个应用程序,你需要做很多工作。例如,如果应用程序弹出一个没有关闭按钮的“保存更改,是/否”对话框怎么办?以上是关于在win32中挂钩的主要内容,如果未能解决你的问题,请参考以下文章
WIN32程序挂钩SetLastError,输出错误描述到控制台