在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_CLOSEWM_SYSCOMMAND

WM_CLOSEWM_SYSCOMMAND / SC_CLOSE 要求关闭窗口。 WM_DESTROY 通知窗口它已关闭。对窗口说“您已关闭”不会使其关闭。

【讨论】:

但是当鼠标指针悬停在程序消息框的关闭按钮上时,这只会关闭命令提示符 @Neal:查看我的扩展答案。是的,它会关闭您将鼠标移到其关闭按钮的窗口,这就是您所要求的。如果你想关闭整个应用程序,你需要做很多工作。例如,如果应用程序弹出一个没有关闭按钮的“保存更改,是/否”对话框怎么办?

以上是关于在win32中挂钩的主要内容,如果未能解决你的问题,请参考以下文章

WIN32程序挂钩SetLastError,输出错误描述到控制台

Win64与Win32的本质区别

在 Winx64 上使用 User32InitializeImmEntryTable?

win32com安装

win32 是啥病毒?

win32是啥意思