C@如何实现WH_CBT全局钩子? 我把钩子相关的做成一个类库项目,再用其他FORM项目用这个类库,键盘和鼠标钩子可以有全局钩子,但是WH_CBT就是不行,怎么实现CBT或者SHELL的全局钩子? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 #include "windows.h"#pragma data_seg("MySeg")HHOOK g_hCbtHook = NULL;HANDLE g_hInst = NULL;#pragma data_seg()#pragma comment(linker,"/section:MySeg,RWS")BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ g_hInst = hModule; return TRUE;}static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam){ return CallNextHookEx(g_hCbtHook, nCode, wParam, lParam);}void HookCbt(bool bHook){ if(bHook) g_hCbtHook = SetWindowsHookEx(WH_CBT, CbtHookProc, g_hInst, 0); else g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL;} 回调函数是放在dll里的Hook.cpp内容如下:C/C++ code#include "Hook.h"#pragma data_seg("MySeg")HHOOK g_hCbtHook = NULL;HWND g_hReceiveWnd = NULL;#pragma data_seg()#pragma comment(linker,"/section:MySeg,RWS")// 设置接受消息的窗口void SetReceiveWnd(HWND hWnd){ g_hReceiveWnd=hWnd;}// 窗口切换钩子回调static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam){ ::SendMessage(g_hReceiveWnd, WM_MY_MESSAGE, (WPARAM)nCode, lParam); return CallNextHookEx(NULL, nCode, wParam, lParam);}// 开关窗口切换钩子bool HookCbt(bool bHook){ if(bHook) { g_hCbtHook = ::SetWindowsHookEx(WH_CBT, CbtHookProc, GetModuleHandle(NULL), 0); return g_hCbtHook ? true : false; } else { g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL; g_hCbtHook = NULL; return true; }}Hook.h内容如下:C/C++ code#pragma once#include "windows.h"#define WM_MY_MESSAGE WM_USER + 1// 设置接受消息的窗口void SetReceiveWnd(HWND hWnd);// 窗口切换钩子回调static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam);// 开关窗口切换钩子bool HookCbt(bool bHook);Hook.def内容如下:C/C++ codeLIBRARY "Hook"EXPORTSSetReceiveWnd @2HookCbt @3 全局钩子必须是DLL,建议你用VC来写吧。 http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx这个解决问题. 只能先用VC做一个DLL项目,然后再用C#使用了 数组动态赋值 多普达T8588智能手机蓝牙转串口,只能发数据,不能接收数据,求助 水晶报表打印版面设置的问题,内有详细描述。 vs2008 安装部署项目遇到系统必备安装后重启问题 能否用C#开发一个类似QQ的通讯软件?? 晕!C#居然不认这个正则表达式 请问怎么对齐代码 关于C#画图的一个问题 请问大家在导出超大的数据,是首先用什么方式? 向web中填充数据! (急) 50分! 关于datagridview的一个选择行的问题 跪求,请教一下Socket.Receive接收长度的问题
#pragma data_seg("MySeg")
HHOOK g_hCbtHook = NULL;
HANDLE g_hInst = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:MySeg,RWS")
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hInst = hModule;
return TRUE;
}
static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hCbtHook, nCode, wParam, lParam);
}
void HookCbt(bool bHook)
{
if(bHook)
g_hCbtHook = SetWindowsHookEx(WH_CBT, CbtHookProc, g_hInst, 0);
else
g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL;
}
回调函数是放在dll里的
Hook.cpp内容如下:C/C++ code
#include "Hook.h"#pragma data_seg("MySeg")
HHOOK g_hCbtHook = NULL;
HWND g_hReceiveWnd = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:MySeg,RWS")// 设置接受消息的窗口
void SetReceiveWnd(HWND hWnd)
{
g_hReceiveWnd=hWnd;
}
// 窗口切换钩子回调
static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
::SendMessage(g_hReceiveWnd, WM_MY_MESSAGE, (WPARAM)nCode, lParam);
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
// 开关窗口切换钩子
bool HookCbt(bool bHook)
{
if(bHook)
{
g_hCbtHook = ::SetWindowsHookEx(WH_CBT, CbtHookProc, GetModuleHandle(NULL), 0);
return g_hCbtHook ? true : false;
}
else
{
g_hCbtHook ? UnhookWindowsHookEx(g_hCbtHook) : NULL;
g_hCbtHook = NULL;
return true;
}
}
Hook.h内容如下:C/C++ code
#pragma once#include "windows.h"#define WM_MY_MESSAGE WM_USER + 1// 设置接受消息的窗口
void SetReceiveWnd(HWND hWnd);
// 窗口切换钩子回调
static LRESULT CALLBACK CbtHookProc(int nCode, WPARAM wParam, LPARAM lParam);
// 开关窗口切换钩子
bool HookCbt(bool bHook);
Hook.def内容如下:C/C++ code
LIBRARY "Hook"EXPORTS
SetReceiveWnd @2
HookCbt @3
这个解决问题.