【问题标题】:Hooking in win32在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;   
 }

【问题讨论】:

    标签: winapi


    【解决方案1】:

    使用wParam=SC_CLOSE 代替WM_CLOSEWM_SYSCOMMAND

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

    【讨论】:

    • 但是当鼠标指针悬停在程序消息框的关闭按钮上时,这只会关闭命令提示符
    • @Neal:查看我的扩展答案。是的,它会关闭您将鼠标移到其关闭按钮的窗口,这就是您所要求的。如果你想关闭整个应用程序,你需要做很多工作。例如,如果应用程序弹出一个没有关闭按钮的“保存更改,是/否”对话框怎么办?
    猜你喜欢
    • 2014-08-31
    • 2011-02-08
    • 2011-11-29
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2021-04-13
    相关资源
    最近更新 更多