先请看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!

解决方案 »

  1.   

    先请看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!
      

  2.   

    hhook=SetWindowsHookEx(WH_GETMESSAGE,SetHook_proc,pInstance,0);
    DispValue=234;
    行吗?
      

  3.   

    加上SECTIONS
    MyData READ WRITE SHARED
    声明以读写方式共享,否则你在这个线程里做的修改不会影响其他引用线程。
      

  4.   

    To casinosun:
    开始就是就是你说的那样,结果不行,才把DispValue=234提前.To ForTopLevel:
    我也考虑到应该是进程间数据共享的问题,但这方面还不太熟练,能否指点一二.
      

  5.   

    #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); //撤销钩子}
      

  6.   

    1.首先,你的变量是普通数据类型,不是 static 变量类型
    2.你所声明的段只起到了修饰作用,只有使用 
    #pragma comment(linker,"/SECTION:MyData,rws")
    后才能被共享
      

  7.   

    你也可以直接到Project->Setting->Link里面加上:  /SECTION:MyData,rws
      

  8.   

    To qrlvls(空气) and kugou123(酷狗):
    试了,还是不行,MessageBox框显示的DispValue值还是0.
      

  9.   

    回楼主,在我的电脑上可以显示出这个值,把DispValue=234;放在前后都没有问题。不过我是放在我一个鼠标钩子里做的,难道不同的钩子对共享的反应不一样,不大可能啊:)