#include "stdafx.h"
#define WM_MYPOS WM_USER+10000
HINSTANCE hmod;
HHOOK hhk;
LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
);
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    hmod=(HINSTANCE)hModule;
    return TRUE;
}HWND    hWnd;
extern "C" __declspec(dllexport) int InstallHook(HWND hwnd)
{
    hWnd=hwnd;
    hhk=SetWindowsHookEx(WH_MOUSE,MouseProc,hmod,0);
    return 0;
}LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{    MOUSEHOOKSTRUCT *mhs=(MOUSEHOOKSTRUCT *)lParam;
    SendMessage(hWnd,WM_MYPOS,mhs->pt.x,mhs->pt.y);
    return    CallNextHookEx(hhk,nCode,wParam,lParam);
}
////////////////////////////////////////
typedef int (* proc)(HWND);
void CDlltestDlg::OnButton1() 
{
    // TODO: Add your control notification handler code here
    HINSTANCE hlib;
    proc InstallHook;
    hlib=LoadLibrary("DllFunc");
    InstallHook=(proc)GetProcAddress(hlib,"InstallHook");
    HWND hwnd;
    hwnd=GetSafeHwnd();
    InstallHook(hwnd);
}void CDlltestDlg::OnMyPos(WPARAM wp,LPARAM lp)
{
    m_x=wp;
    m_y=lp;
    UpdateData(false);
}

解决方案 »

  1.   

    to:  rocshaw(太阳鸟)
    你現在用的就是全局勾子﹐但是当进程在载入DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,也就是说每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。亦即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。 try something like:
    #pragma data_seg ("shareddata") HINSTANCE hmod = NULL;
    HHOOK hhk = NULL; //共享数据 #pragma data_seg() 在.DEF文件中加入如下语句: 
    SETCTIONS 
    shareddata READ WRITE SHARED good luck
      

  2.   

    by the way,
    在你的程序中有﹕
    HWND    hWnd;   // 我不是很理解這個變量。在你給出的代碼裡不必要。
                    // if i am wrong, correct me please.
    extern "C" __declspec(dllexport) int InstallHook(HWND hwnd)
    {
        hWnd=hwnd;
        hhk=SetWindowsHookEx(WH_MOUSE,MouseProc,hmod,0);
        return 0;
    }
      

  3.   

    #pragma data_seg ("shareddata") 
    HHOOK hhk = NULL; //共享数据 
    #pragma data_seg() 这样OK了
      

  4.   

    oho....I think the reason is that you created a exe file.If you wanna create a global hook,you should intall your hook in a DLL project or install a JournalRecordProc hook in your exe.
      

  5.   

    to gull1234(俗不可耐)   
    在你的程序中有﹕
    HWND    hWnd;   // 我不是很理解這個變量。在你給出的代碼裡不必要。
    我在钩子函数中,SendMessage(hWnd,....),钩子函数也在dll中
      

  6.   

    hwnd and hhook都要放在共享段,他们必须保证对每个进程都有相同的值。
      

  7.   

    to NowCan(能量、激情、雨水、彩虹——雷雨云)
    好像还是不行
    #pragma data_seg ("shareddata") 
    //HHOOK hhk = NULL; //共享数据 
    HWND hWnd;
    HHOOK hhk;
    #pragma data_seg() 
    就行了吗
      

  8.   

    #pragma data_seg ("shareddata") 
    //HHOOK hhk = NULL; //共享数据 
    HWND hWnd=NULL;
    HHOOK hhk=NULL;
    #pragma data_seg() 要赋初值!
      

  9.   

    to  dycdyc123(重出江湖) 
    连你都没看出问题来
      

  10.   

    #pragma data_seg(".drectve")
        static char szLinkDirectiveShared[] = "-section:Shared,rws";
    #pragma data_seg()
    #pragma data_seg("Shared")HHOOK g_hhook      = NULL;
    HWND  g_hwndPost   = NULL;
    UINT  g_uMsgNotify = WM_USER;#pragma data_seg()
      

  11.   

    FYI
    http://vip.6to23.com/NowCan1/code/kbdtrc.zip