做了一hook本线程的钩子程序,想对menu发出的WM_COMMAND消息进行额外的处理,但是发现hook不上menu的WM_COMMAND消息,然而工具栏或者是按钮发出的WM_COMMAND消息都可以截获,请大家指教了
======================================================================
源代码如下:
======================================================================
HINSTANCE hins;
#pragma data_seg(".SHARDAT")
static HHOOK hhk=NULL;
#pragma data_seg()BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
hins = (HINSTANCE)hModule;
return TRUE;
}LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) // do not process message
return CallNextHookEx(hhk, nCode, wParam, lParam);
CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam; switch (nCode)
{
case HC_ACTION:
if (pCwp->message == WM_COMMAND)
{
//判断消息是否是由menu发出
if ((HIWORD(pCwp->wParam) == 0) )
{
//判断menu的ID
if (LOWORD(pCwp->wParam) >= 50000)
{
//...用户的处理 }
}
}
break;
default:
break;
}
return CallNextHookEx(hhk, nCode, wParam, lParam); }
BOOL __declspec(dllexport)__stdcall InstallHook(DWORD dwThreadId)
{
hhk = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,dwThreadId);
if (hhk != NULL)
return TRUE;
else
return FALSE;
}BOOL __declspec(dllexport)__stdcall UnInstallHook()
{
BOOL bSuc = UnhookWindowsHookEx(hhk);
return bSuc;
}
======================================================================
源代码如下:
======================================================================
HINSTANCE hins;
#pragma data_seg(".SHARDAT")
static HHOOK hhk=NULL;
#pragma data_seg()BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
hins = (HINSTANCE)hModule;
return TRUE;
}LRESULT WINAPI CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) // do not process message
return CallNextHookEx(hhk, nCode, wParam, lParam);
CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam; switch (nCode)
{
case HC_ACTION:
if (pCwp->message == WM_COMMAND)
{
//判断消息是否是由menu发出
if ((HIWORD(pCwp->wParam) == 0) )
{
//判断menu的ID
if (LOWORD(pCwp->wParam) >= 50000)
{
//...用户的处理 }
}
}
break;
default:
break;
}
return CallNextHookEx(hhk, nCode, wParam, lParam); }
BOOL __declspec(dllexport)__stdcall InstallHook(DWORD dwThreadId)
{
hhk = SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hins,dwThreadId);
if (hhk != NULL)
return TRUE;
else
return FALSE;
}BOOL __declspec(dllexport)__stdcall UnInstallHook()
{
BOOL bSuc = UnhookWindowsHookEx(hhk);
return bSuc;
}
解决方案 »
- 不用web控件,vc如何调用js脚本
- 大家平时都去什么网站啊 放假在家挺无聊的 介绍个好网站呗(不要娱乐类的网站)
- 图像处理问题 从一幅图中提取信息
- 如何屏蔽SQLConfigDataSource配置数据源时,参数出错而自动弹出的ODBC数据源配置对话框
- 怎么清空动态数组
- 怎样控制一个ActiveX控件的默认大小
- C#用的是什么开发环境?仍用VC的开发环境吗?还是C#有专门的开发环境?
- 微软_编程精粹 作者姓名 Microsoft 打包下载
- 请教各位高手一个问题
- 在VC中如何控制ACCESS程序的执行,如操纵菜单。。。。
- 正在进行对话框操作的框架程序如何通过代码强行关闭?在线等待
- 能否用软件实现定时开机啊??
Menu屬於非客戶區好像不對Windows Message響應
至於詳細代碼可以看看CreateWindow
解决方法如楼上所说。
同意!