设置WH_CBT全局钩子无法获取其他窗口的消息

songcser 2013-10-30 06:00:04
以下是我的代码,设置了三个全局钩子,鼠标和键盘的可以监控全局的,但是WH_CBT的只能获取自己窗口的信息,其他窗口改变就不能获取信息了。为什么呢?
#include "stdafx.h"
#include <windows.h>
#include "SystemHookCore.h"
#include "MessageFilter.h"

HookProc UserMouseHookCallback = NULL;
HookProc UserKeyboardHookCallback = NULL;
HookProc UserCBTHookCallback = NULL;
#pragma data_seg("TestData")
HHOOK hookMouse = NULL;
HHOOK hookKeyboard = NULL;
HHOOK hookCBT = NULL;
#pragma data_seg()

#pragma comment(linker,"/section:.TestData,rws")
//
// Store the application instance of this module to pass to
// hook initialization. This is set in DLLMain().
//
HINSTANCE g_appInstance = NULL;

MessageFilter mouseFilter;
MessageFilter keyboardFilter;
MessageFilter cbtFilter;

static LRESULT CALLBACK InternalKeyboardHookCallback(int code, WPARAM wparam, LPARAM lparam);
static LRESULT CALLBACK InternalMouseHookCallback(int code, WPARAM wparam, LPARAM lparam);
static LRESULT CALLBACK InternalCBTHookCallback(int code, WPARAM wparam, LPARAM lparam);

int SetUserHookCallback(HookProc userProc, UINT hookID)
{
if (userProc == NULL)
{
return HookCoreErrors::SetCallBack::ARGUMENT_ERROR;
}

if (hookID == WH_KEYBOARD_LL)
{
if (UserKeyboardHookCallback != NULL)
{
return HookCoreErrors::SetCallBack::ALREADY_SET;
}

UserKeyboardHookCallback = userProc;
keyboardFilter.Clear();
return HookCoreErrors::SetCallBack::SUCCESS;
}
else if (hookID == WH_MOUSE_LL)
{
if (UserMouseHookCallback != NULL)
{
return HookCoreErrors::SetCallBack::ALREADY_SET;
}

UserMouseHookCallback = userProc;
mouseFilter.Clear();
return HookCoreErrors::SetCallBack::SUCCESS;
}
else if (hookID == WH_CBT)
{
if (UserCBTHookCallback != NULL)
{
return HookCoreErrors::SetCallBack::ALREADY_SET;
}
UserCBTHookCallback = userProc;
cbtFilter.Clear();
return HookCoreErrors::SetCallBack::SUCCESS;
}
return HookCoreErrors::SetCallBack::NOT_IMPLEMENTED;
}

bool InitializeHook(UINT hookID, int threadID)
{
if (g_appInstance == NULL)
{
return false;
}

if (hookID == WH_KEYBOARD_LL)
{
if (UserKeyboardHookCallback == NULL)
{
return false;
}

hookKeyboard = SetWindowsHookEx(hookID, (HOOKPROC)InternalKeyboardHookCallback, g_appInstance, threadID);
return hookKeyboard != NULL;
}
else if (hookID == WH_MOUSE_LL)
{
if (UserMouseHookCallback == NULL)
{
return false;
}

hookMouse = SetWindowsHookEx(hookID, (HOOKPROC)InternalMouseHookCallback, g_appInstance, threadID);
return hookMouse != NULL;
}
else if (hookID == WH_CBT)
{
if (UserCBTHookCallback==NULL)
{
return false;
}

hookCBT = SetWindowsHookEx(hookID,(HOOKPROC)InternalCBTHookCallback,g_appInstance,threadID);
return hookCBT != NULL;
}
return false;
}

void UninitializeHook(UINT hookID)
{
if (hookID == WH_KEYBOARD_LL)
{
if (hookKeyboard != NULL)
{
UnhookWindowsHookEx(hookKeyboard);
}
hookKeyboard = NULL;
}
else if (hookID == WH_MOUSE_LL)
{
if (hookMouse != NULL)
{
UnhookWindowsHookEx(hookMouse);
}
hookMouse = NULL;
}
else if (hookID == WH_CBT)
{
if (hookCBT != NULL)
{
UnhookWindowsHookEx(hookCBT);
}
hookCBT = NULL;
}
}

void Dispose(UINT hookID)
{
if (hookID == WH_KEYBOARD_LL)
{
UserKeyboardHookCallback = NULL;
}
else if (hookID == WH_MOUSE_LL)
{
UserMouseHookCallback = NULL;
}
else if (hookID == WH_CBT)
{
UserCBTHookCallback = NULL;
}
}

int FilterMessage(UINT hookID, int message)
{
if (hookID == WH_KEYBOARD_LL)
{
if (keyboardFilter.AddMessage(message))
{
return HookCoreErrors::FilterMessage::SUCCESS;
}
else
{
return HookCoreErrors::FilterMessage::FAILED;
}
}
else if (hookID == WH_MOUSE_LL)
{
if(mouseFilter.AddMessage(message))
{
return HookCoreErrors::FilterMessage::SUCCESS;
}
else
{
return HookCoreErrors::FilterMessage::FAILED;
}
}
else if (hookID == WH_CBT)
{
if (cbtFilter.AddMessage(message))
{
return HookCoreErrors::FilterMessage::SUCCESS;
}
else
{
return HookCoreErrors::FilterMessage::FAILED;
}
}

return HookCoreErrors::FilterMessage::NOT_IMPLEMENTED;
}

static LRESULT CALLBACK InternalMouseHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code < 0)
{
return CallNextHookEx(hookMouse, code, wparam, lparam);
}

if (UserMouseHookCallback != NULL && !mouseFilter.IsFiltered((int)wparam))
{
UserMouseHookCallback(code, wparam, lparam);
}

return CallNextHookEx(hookMouse, code, wparam, lparam);
}

static LRESULT CALLBACK InternalKeyboardHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code < 0)
{
return CallNextHookEx(hookKeyboard, code, wparam, lparam);
}

if (UserKeyboardHookCallback != NULL && !keyboardFilter.IsFiltered((int)wparam))
{
UserKeyboardHookCallback(code, wparam, lparam);
}

return CallNextHookEx(hookKeyboard, code, wparam, lparam);
}

static LRESULT CALLBACK InternalCBTHookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if(code < 0)
{
return CallNextHookEx(hookCBT,code,wparam,lparam);
}

if (UserCBTHookCallback!=NULL&&!cbtFilter.IsFiltered((int)wparam))
{
UserCBTHookCallback(code, wparam, lparam);
}

return CallNextHookEx(hookCBT,code,wparam,lparam);
}
...全文
298 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
songcser 2013-11-06
  • 打赏
  • 举报
回复
没有人会吗?

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧