如何区分一个窗口是不是被鼠标点击激活?

Posted

技术标签:

【中文标题】如何区分一个窗口是不是被鼠标点击激活?【英文标题】:How to distinguish if a window is being activated by mouse click?如何区分一个窗口是否被鼠标点击激活? 【发布时间】:2021-09-05 09:50:09 【问题描述】:

我目前正在使用以下代码挂钩窗口激活:

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)

    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

    HWND hwnd      = reinterpret_cast<HWND>(wParam);

    switch (nCode)
    
    case HCBT_ACTIVATE: // The system is about to activate a window.
    
        return 0; // 0 - Allow 1 - Deny
    
    
    return 0;

来自文档:

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644977(v=vs.85)

lParam 指定一个指向包含活动窗口句柄的 CBTACTIVATESTRUCT 结构的长指针,并指定激活是否因鼠标单击而改变。

如何解读lParam 的值并加以区分?

【问题讨论】:

【参考方案1】:

正如文档所述,对于HCBT_ACTIVATElParam 指定了一个指向CBTACTIVATESTRUCT 的指针,因此只需相应地对其进行类型转换,就像您对wParam 所做的那样,例如:

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
    _In_ int    nCode,
    _In_ WPARAM wParam,
    _In_ LPARAM lParam
)

    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

    switch (nCode)
    
        case HCBT_ACTIVATE: // The system is about to activate a window.
        
            HWND hwnd = reinterpret_cast<HWND>(wParam);
            CBTACTIVATESTRUCT* cbt = reinterpret_cast<CBTACTIVATESTRUCT*>(lParam);
            // use hwnd, cbt->fMouse, and cbt->hWndActive as needed...
            return 0; // 0 - Allow 1 - Deny
        
    
    return 0;

【讨论】:

当点击任务栏cbt-&gt;fMouse激活窗口时返回0,。我目前挂钩HCBT_ACTIVATE 的主要原因是检测窗口何时被另一个在其上方最小化的窗口激活,你知道我该如何区分吗? @Razec 任务栏按钮代表一个窗口,但不是实际的窗口。用鼠标激活窗口是指点击窗口本身。 AFAIK,无法确定任务栏是否正在激活窗口。但cbt-&gt;hWndActive 应该是失去焦点的窗口。

以上是关于如何区分一个窗口是不是被鼠标点击激活?的主要内容,如果未能解决你的问题,请参考以下文章

qt中当鼠标点击子窗口时如何让父窗口响应鼠标点击事件?

如何区分鼠标“点击”和“拖动”

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

区分鼠标和键盘触发onclick

js 如何阻止 “Ctrl”+鼠标左键 点击A标签, 在新窗口打开

用鼠标中键点击网页,为啥不是直接跳到新的窗口,而是仍在原来的窗口?