如何通过CBT钩子判断窗口激活是否由鼠标点击触发
实现步骤
- 先确保已经引入Windows SDK头文件
#include <windows.h>,系统已预先定义CBTACTIVATESTRUCT结构体,结构定义如下:
typedef struct tagCBTACTIVATESTRUCT { BOOL fMouse; HWND hWndActive; } CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
fMouse成员:值为TRUE代表本次窗口激活由鼠标点击触发,值为FALSE代表由其他方式触发(比如Alt+Tab键盘切换、程序主动调用API激活窗口等)hWndActive成员:代表本次激活前处于激活状态的窗口句柄
- 在
HCBT_ACTIVATE分支内将lParam强制转换为CBTACTIVATESTRUCT类型的指针即可读取对应字段,修改后的代码示例如下:
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: // 系统即将激活一个窗口 { // 解析lParam获取激活触发来源 auto* activateInfo = reinterpret_cast<LPCBTACTIVATESTRUCT>(lParam); if (activateInfo->fMouse) { // 此处处理鼠标点击触发的窗口激活逻辑 } else { // 此处处理非鼠标触发的窗口激活逻辑 } return 0; // 0 - 允许激活 1 - 阻止激活 } } return 0; }
内容的提问来源于stack exchange,提问作者user14761342
相关产品推荐
相关产品推荐

