关于钩子,高手请进.

WuOu 2005-07-12 09:02:05
先请看DLL的一个实现文件.cpp中的设置全局钩子的代码:

#pragma data_seg("MyData")
HHOOK hhook=NULL; //钩子句柄
HINSTANCE pInstance=NULL; //钩子模块句柄
UINT DispValue=0; //记录鼠标单击次数的变量
#pragma data_seg()

static LRESULT WINAPI SetHook_proc(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT lResult=CallNextHookEx(hhook,nCode,wParam,lParam);

if(HC_ACTION==nCode)
{
HARDWAREHOOKSTRUCT *pHardWareHook=(HARDWAREHOOKSTRUCT*)lParam;
if(MM_MIXM_CONTROL_CHANGE==pHardWareHook->message)
{
CString strMsg;
strMsg.Format("DispValue=%d!",DispValue);
MessageBox(NULL,strMsg,"mouse_proc",MB_OK);
}

}

return (lResult);
}

extern "C" _declspec(dllexport) void SetHook()
{
DispValue=234;
hhook=SetWindowsHookEx(WH_GETMESSAGE,SetHook_proc,pInstance,0);
}

extern "C" _declspec(dllexport) void UnSetHook()
{
UnhookWindowsHookEx(hhook); //撤销钩子

}

问题是:DispValue的值我分明在SetHook函数中设置为234,可是在钩子响应过程SetHook_proc中DispValue却始终都是0,我用MessageBox显示消息,输出它的值,始终是0!


...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForTopLevel 2005-07-22
  • 打赏
  • 举报
回复
回楼主,在我的电脑上可以显示出这个值,把DispValue=234;放在前后都没有问题。不过我是放在我一个鼠标钩子里做的,难道不同的钩子对共享的反应不一样,不大可能啊:)
WuOu 2005-07-14
  • 打赏
  • 举报
回复
再顶一下。
WuOu 2005-07-13
  • 打赏
  • 举报
回复
To qrlvls(空气) and kugou123(酷狗):
试了,还是不行,MessageBox框显示的DispValue值还是0.
WuOu 2005-07-13
  • 打赏
  • 举报
回复
大虾们,快来顶呀.
WuOu 2005-07-12
  • 打赏
  • 举报
回复
To casinosun:
开始就是就是你说的那样,结果不行,才把DispValue=234提前.

To ForTopLevel:
我也考虑到应该是进程间数据共享的问题,但这方面还不太熟练,能否指点一二.
ForTopLevel 2005-07-12
  • 打赏
  • 举报
回复
加上SECTIONS
MyData READ WRITE SHARED
声明以读写方式共享,否则你在这个线程里做的修改不会影响其他引用线程。
casinosun 2005-07-12
  • 打赏
  • 举报
回复
hhook=SetWindowsHookEx(WH_GETMESSAGE,SetHook_proc,pInstance,0);
DispValue=234;
行吗?
WuOu 2005-07-12
  • 打赏
  • 举报
回复
先请看DLL的一个实现文件.cpp中的设置全局钩子的代码:

#pragma data_seg("MyData")
HHOOK hhook=NULL; //钩子句柄
HINSTANCE pInstance=NULL; //钩子模块句柄
UINT DispValue=0;
#pragma data_seg()

static LRESULT WINAPI SetHook_proc(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT lResult=CallNextHookEx(hhook,nCode,wParam,lParam);

if(HC_ACTION==nCode)
{
HARDWAREHOOKSTRUCT *pHardWareHook=(HARDWAREHOOKSTRUCT*)lParam;
if(MM_MIXM_CONTROL_CHANGE==pHardWareHook->message)
{
CString strMsg;
strMsg.Format("DispValue=%d!",DispValue);
MessageBox(NULL,strMsg,"mouse_proc",MB_OK);
}

}

return (lResult);
}

extern "C" _declspec(dllexport) void SetHook()
{
DispValue=234;
hhook=SetWindowsHookEx(WH_GETMESSAGE,SetHook_proc,pInstance,0);
}

extern "C" _declspec(dllexport) void UnSetHook()
{
UnhookWindowsHookEx(hhook); //撤销钩子

}

问题是:DispValue的值我分明在SetHook函数中设置为234,可是在钩子响应过程SetHook_proc中DispValue却始终都是0,我用MessageBox显示消息,输出它的值,始终是0!
kugou123 2005-07-12
  • 打赏
  • 举报
回复
你也可以直接到Project->Setting->Link里面加上: /SECTION:MyData,rws
qrlvls 2005-07-12
  • 打赏
  • 举报
回复
1.首先,你的变量是普通数据类型,不是 static 变量类型
2.你所声明的段只起到了修饰作用,只有使用
#pragma comment(linker,"/SECTION:MyData,rws")
后才能被共享
cdcjk 2005-07-12
  • 打赏
  • 举报
回复
#pragma data_seg("MyData")
HHOOK hhook=NULL; //钩子句柄
HINSTANCE pInstance=NULL; //钩子模块句柄
UINT DispValue=0;
#pragma data_seg()

static LRESULT WINAPI SetHook_proc(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT lResult=CallNextHookEx(hhook,nCode,wParam,lParam);

if(HC_ACTION==nCode)
{
HARDWAREHOOKSTRUCT *pHardWareHook=(HARDWAREHOOKSTRUCT*)lParam;
if(MM_MIXM_CONTROL_CHANGE==pHardWareHook->message)
{
CString strMsg;
strMsg.Format("DispValue=%d!",DispValue);
MessageBox(NULL,strMsg,"mouse_proc",MB_OK);
}

}

return (lResult);
}

extern "C" _declspec(dllexport) void SetHook()
{
DispValue=234;
hhook=SetWindowsHookEx(WH_GETMESSAGE,SetHook_proc,pInstance,0);
}

extern "C" _declspec(dllexport) void UnSetHook()
{
UnhookWindowsHookEx(hhook); //撤销钩子

}
WuOu 2005-07-12
  • 打赏
  • 举报
回复
顶一下,别沉了.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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