私はアプリケーション(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]をクリックします。だから私は何が足りないのですか?このメッセージをグローバルフックで捕捉することはできません。すべての単一のコントロールに同じコードを入れなくてもこれを行う方法はありますか?
ありがとうございました。
ハビエル
C++のWindowsプログラミングについてはわかりませんが、Cの経験からは、メッセージポンプを同じスレッドに入れておく必要があります。 – merkuro