小虾想通过Win32动态库中用钩子实现对自定义消息的截获请问如何做?有何方法...
多多指教。

解决方案 »

  1.   

    安装线程或者系统钩子SetWindowsHookEx()百度,谷歌网上一搜一大把
      

  2.   

    我这里有个全局挂钩。第一次sethook后可以钩到,unhook后再sethook就钩不到了,只有重新运行我这个程序才能再钩到,不知道为什么,请帮忙。
    以下是.h文件。
    // HelloDll.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "HelloDll.h"#pragma data_seg("mydata")
    HWND glhPrevTarWnd=NULL; 
    // 上次鼠标所指的窗口句柄 
    HWND glhDisplayWnd=NULL; 
    // 显示目标窗口标题编辑框的句柄 
    HHOOK glhHook=NULL; 
    // 安装的鼠标勾子句柄 
    HINSTANCE glhInstance=NULL; 
    // DLL实例句柄
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:mydata,RWS")BOOL APIENTRY DllMain( HINSTANCE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    //如果使用lpReserved参数则删除下面这行 
    UNREFERENCED_PARAMETER(lpReserved);      switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    glhInstance=hModule;
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }
    // 鼠标挂钩函数
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    LPMOUSEHOOKSTRUCT lpMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
    if(nCode>=0)
    {
    // 取目标窗口句柄
    HWND TargetWnd=lpMouseHook->hwnd;
    // 取应用程序主窗体
    HWND ParentWnd=TargetWnd;
    while(ParentWnd!=NULL)
    {
    TargetWnd=ParentWnd;
    ParentWnd=::GetParent(TargetWnd);
    }
    if(TargetWnd!=glhPrevTarWnd)
    {
    char szCaption[100];
    ::GetWindowText(TargetWnd,szCaption,100);
    //char szX[100],szY[100];
    //POINT pt;
    //GetCursorPos(&pt);
    //ScreenToClient(GetForegroundWindow(),&pt);
    //ltoa(pt.x,szX,10);
    //ltoa(pt.y,szY,10);
    //strcpy(szCaption,szX);
    //strcat(szCaption,",");
    //strcat(szCaption,szY);
    if(::IsWindow(glhDisplayWnd)){
    ::SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
    //SendMessage(glhDisplayWnd,WM_USER+6,0,(LPARAM)1);//自定义消息
    }
    glhPrevTarWnd=TargetWnd;
    }
    }
    // 继续传递消息
    return ::CallNextHookEx(glhHook,nCode,wParam,lParam);
    }
    // 安装挂钩
    BOOL StartHook(HWND hWnd)
    {
    BOOL bResult=FALSE;
    glhHook=::SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,NULL);
    if(glhHook!=NULL)bResult=TRUE;
    glhDisplayWnd=hWnd;
    //设置显示目标窗口标题编辑框的句柄
    return bResult;
    }
    // 卸载挂钩
    BOOL StopHook()
    {
    BOOL bResult=FALSE;
    if(glhHook)
    {
    bResult=::UnhookWindowsHookEx(glhHook);
    if(bResult)
    {
    glhPrevTarWnd=NULL;
    glhDisplayWnd=NULL;
    glhHook=NULL;
    }
    }
    return bResult;
    }