2009-06-25 18 views
0

私はアプリケーション(MFC)内のいくつかのコントロールのカスタムツールチップを実装しましたが、すべてのコントロールに対して一般的にしたいと思います。グローバルフック内のWM_MOUSEHOVER

今私はWM_MOUSEMOVEでTrackMouseEventを呼び出して、WM_MOUSEHOVER(両方ともコントロールの上書きされた関数WindowProc)を捕まえています。しかし、このように私はすべてのコントロールのコードを複製する必要があります。だから、私の意図は、マウスイベントのグローバルフックを設定し、メッセージがツールチップに表示されるようにコントロールを要求することでした。

グローバルフックでWM_MOUSEHOVERを捕まえることができないという問題があります。これはコードです:

hMouseHook = SetWindowsHookEx( WH_MOUSE, 
           CallWndMouseProc, 
           NULL, 
           AfxGetThread()->m_nThreadID); 
hMainHook = SetWindowsHookEx( WH_CALLWNDPROC, 
           CallWndProc, 
           NULL, 
           AfxGetThread()->m_nThreadID); 

LRESULT CALLBACK CallWndMouseProc(int nCode, 
            WPARAM wParam, 
            LPARAM lParam) 
{ 
    if(nCode == HC_ACTION) 
    { 
     MOUSEHOOKSTRUCT* pwp = (MOUSEHOOKSTRUCT*)lParam; 
     TRACE( _T("message: %x hwnd: %x x: %d y: %d\n"), 
        wParam, 
        pwp->hwnd, 
        pwp->pt.x, 
        pwp->pt.y); 

     TRACKMOUSEEVENT eventTrack; 

     eventTrack.cbSize  = sizeof(TRACKMOUSEEVENT); 
     eventTrack.dwFlags  = TME_HOVER; 
     eventTrack.dwHoverTime = HOVER_DEFAULT; 
     eventTrack.hwndTrack = pwp->hwnd; 

     _TrackMouseEvent(&eventTrack); 

     if(wParam == WM_MOUSEHOVER) 
     { 
      AfxMessageBox(_T("CallWndMouseProc: WM_MOUSEHOVER")); 
     } 
    } 

    // let the messages through to the next hook 
    return CallNextHookEx( hMouseHook, 
          nCode, 
          wParam, 
          lParam); 
} 

LRESULT CALLBACK CallWndProc( int nCode, 
           WPARAM wParam, 
           LPARAM lParam) 
{ 
    if(nCode == HC_ACTION) 
    { 
     CWPSTRUCT *pData = (CWPSTRUCT*)lParam; 
     if(pData->message == WM_MOUSEHOVER) 
     { 
      AfxMessageBox(_T("CallWndProc: WM_MOUSEHOVER")); 
     } 
    } 

    // let the messages through to the next hook 
    return CallNextHookEx( hMainHook, 
          nCode, 
          wParam, 
          lParam); 
} 

両フックは、メッセージの残りのためのコールされており、私はそれがWindowProc関数でキャプチャだからWM_MOUSEHOVERが送られていると確信しています。たとえば、これはカスタムCListBoxのWindowProc関数です。

[OK]をクリックします。だから私は何が足りないのですか?このメッセージをグローバルフックで捕捉することはできません。すべての単一のコントロールに同じコードを入れなくてもこれを行う方法はありますか?

ありがとうございました。

ハビエル

+0

C++のWindowsプログラミングについてはわかりませんが、Cの経験からは、メッセージポンプを同じスレッドに入れておく必要があります。 – merkuro

答えて

1

WM_MOUSEHOVERは、スレッドのメッセージキューにポストされたので、あなたはWH_CALLWNDPROC(つまり、送信されたメッセージのためです)とそれを表示されません。 WH_MOUSEはポストされたメッセージを取得するので、あなたがそれを見ていないのはちょっと奇妙だと思います...おそらく、フックは低レベルのマウス入力メッセージを受け取るだけでしょうか? WH_GETMESSAGEフックを試してください。

+0

はい、あなたは正しいです。私はちょうどWH_GETMESSAGEを試してみましたが、それは動作します。 ありがとう! –

関連する問題