SetWindowsHookEx的第三个参数要用NULL.

解决方案 »

  1.   

    你的不是全局勾子,當然不能勾別的窗口鼠標活動,參考一下下面程序
    #define EXPORT extern __declspec(dllexport)
    #define UM_MOUSEHOOK (WM_USER+567)#pragma data_seg("Shared") HWND g_hWndMain = NULL ; 
    HHOOK g_hHook = NULL ; 
    HINSTANCE g_hInstance = NULL ; 
    HWND g_hPrevTarWnd = NULL ; 
    LPMOUSEHOOKSTRUCT pMouseHook ;#pragma data_seg() 
    #pragma comment( linker, "/section:Shared,rws" )extern BOOL APIENTRY DllMain( HINSTANCE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    switch( ul_reason_for_call )
    {
    case DLL_PROCESS_ATTACH :
    g_hInstance = hModule ;
    break ;
    case DLL_THREAD_ATTACH :
    break ;
    case DLL_THREAD_DETACH : ;
    break ;
    case DLL_PROCESS_DETACH :
    break ;
    }    return TRUE;
    }LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam )
    {
    static HWND hTargetWnd = NULL ; 
    static HWND hParentWnd = NULL ; 
    pMouseHook = (LPMOUSEHOOKSTRUCT) lParam ; 
    if( nCode>=0 )
    {
    hTargetWnd = pMouseHook->hwnd ; 
    hParentWnd = hTargetWnd ; 
    if( hTargetWnd != g_hPrevTarWnd ) 

    GetWindowText( hTargetWnd, szCaption, 99 ) ; 

    if( IsWindow( g_hWndMain ) )
    PostMessage( g_hWndMain, UM_MOUSEHOOK, 0, (LPARAM)hTargetWnd ) ; 
    g_hPrevTarWnd = hTargetWnd ; 
    }
    } return CallNextHookEx( g_hHook, nCode, wParam, lParam ) ;
    }EXPORT int InitMouseHookDll( HWND hwndMainWindow )
    {
    g_hWndMain = hwndMainWindow ;
    return 0 ;
    }EXPORT int InstallFilter( BOOL InstallOrUninstall )
    {
       if( TRUE == InstallOrUninstall )
    {
    g_hHook = SetWindowsHookEx( WH_MOUSE, (HOOKPROC)(FARPROC)MouseProc , g_hInstance, 0 ) ;
    }
    else if( FALSE == InstallOrUninstall )
    UnhookWindowsHookEx( g_hHook ) ;
    return 0 ;
    }
      

  2.   

    你的SetWindowsHookEx不是全局钩子.
      

  3.   

    你的SetWindowsHookEx不是全局钩子. 
      

  4.   

    if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,GetCurrentThreadId())))应为
    if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hInst,0)))
      

  5.   

    同意JimHu的,
    全局钩子要放在DLL中才能使用,
      

  6.   

    除了thread ID 必须为0,
    全局钩子里的下面哪个null必须是hook handle!!
    return CallNextHookEx(*NULL*,nCode,wParam,lParam);因为你的程序要跨越进程,因此这些代码都要放到dll里,而且必须用FileMapping之类的IPC方法实现跨进程的变量传递,否则得不到正确的hook handle