如何区分一个窗口是不是被鼠标点击激活?
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_ACTIVATE
,lParam
指定了一个指向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->fMouse
激活窗口时返回0,。我目前挂钩HCBT_ACTIVATE
的主要原因是检测窗口何时被另一个在其上方最小化的窗口激活,你知道我该如何区分吗?
@Razec 任务栏按钮代表一个窗口,但不是实际的窗口。用鼠标激活窗口是指点击窗口本身。 AFAIK,无法确定任务栏是否正在激活窗口。但cbt->hWndActive
应该是失去焦点的窗口。以上是关于如何区分一个窗口是不是被鼠标点击激活?的主要内容,如果未能解决你的问题,请参考以下文章