你写的钩子函数应该声明为__stdcall.比如:
LRESULT CALLBACK MouseProc(
  int nCode,   WPARAM wParam,  LPARAM lParam);
CALLBACK就是__stdcall,或者用WINAPI也可以.

解决方案 »

  1.   

    #include "stdafx.h"
    #include <afxdllx.h>
    #include "mousehook.h"
    #pragma data_seg("mydata") 
        HWND glhPrevTarWnd=NULL; 
         HWND glhDisplayWnd=NULL; //上次鼠标所指的窗口句柄 
         HHOOK glhHook=NULL; //显示目标窗口标题编辑框的句柄 
         HINSTANCE glhInstance=NULL; //安装的鼠标勾子句柄 
    #pragma data_seg() 
    static AFX_EXTENSION_MODULE MousehookDLL = { NULL, NULL };
    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
    {
    TRACE0("MOUSEHOOK.DLL Initializing!\n");

    // Extension DLL one-time initialization
    if (!AfxInitExtensionModule(MousehookDLL, hInstance))
    return 0; // Insert this DLL into the resource chain
    // NOTE: If this Extension DLL is being implicitly linked to by
    //  an MFC Regular DLL (such as an ActiveX Control)
    //  instead of an MFC application, then you will want to
    //  remove this line from DllMain and put it in a separate
    //  function exported from this Extension DLL.  The Regular DLL
    //  that uses this Extension DLL should then explicitly call that
    //  function to initialize this Extension DLL.  Otherwise,
    //  the CDynLinkLibrary object will not be attached to the
    //  Regular DLL's resource chain, and serious problems will
    //  result. new CDynLinkLibrary(MousehookDLL);
            glhInstance=hInstance; 
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
    TRACE0("MOUSEHOOK.DLL Terminating!\n");
    // Terminate the library before destructors are called
    AfxTermExtensionModule(MousehookDLL);
    }
    return 1;   // ok
    }
    Cmousehook::Cmousehook() 


    Cmousehook::~Cmousehook() 

    stophook(); 

    BOOL Cmousehook::starthook(HWND hWnd) //安装钩子并设定接收显示窗口句柄 
    { BOOL bResult=FALSE; 
      glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0); 
      if(glhHook!=NULL) 
       bResult=TRUE; 
         glhDisplayWnd=hWnd; //设置显示目标窗口标题编辑框的句柄
          return bResult; 

    BOOL Cmousehook::stophook() //卸载钩子 

    BOOL bResult=FALSE; 
    if(glhHook) 

    bResult= UnhookWindowsHookEx(glhHook); 
    if(bResult) 

    glhPrevTarWnd=NULL; 
    glhDisplayWnd=NULL;//清变量 
    glhHook=NULL; 


    return bResult; 

    LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam) 

       LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam; 
       if (nCode>=0) 
       { 
         HWND glhTargetWnd=pMouseHook->hwnd; 
    //取目标窗口句柄 
          HWND ParentWnd=glhTargetWnd; 
         while (ParentWnd !=NULL) 
     { glhTargetWnd=ParentWnd; 
           ParentWnd=GetParent(glhTargetWnd); 
    //取应用程序主窗口句柄 
     } 
        if(glhTargetWnd!=glhPrevTarWnd) 

    char szCaption[100]; 
         GetWindowText(glhTargetWnd,szCaption,100); 
    //取目标窗口标题 
         if(IsWindow(glhDisplayWnd)) 
          SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption); 
           glhPrevTarWnd=glhTargetWnd; 
    //保存目标窗口 


    return CallNextHookEx(glhHook,nCode,wparam,lparam); 
    //继续传递消息 
    }
    怎么还是出现这个问题呢?
      

  2.   

    好象必须是CALLBACK才行,WINAPI不行,编译通不过