我已经为我的应用程序(MFC)中的几个控件实现了自定义工具提示,但我想使其适用于所有控件。
现在,我在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);
}这两个钩子都在为其余的消息调用,我确信正在发送WM_MOUSEHOVER,因为它是在WindowProc函数中捕获的。例如,这是一个自定义CListBox的WindowProc函数:
LRESULT CMyListBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_MOUSEHOVER)
{
AfxMessageBox(_T("WindowProc: WM_MOUSEHOVER"));
}
return CListBox::WindowProc(message, wParam, lParam);
}好的。那么我错过了什么呢?在全局钩子中捕获此消息是不可能的?有没有其他方法可以做到这一点,而不需要在每个控件中都放入相同的代码?
谢谢。
哈维尔
发布于 2009-06-25 12:27:05
WM_MOUSEHOVER被发布到线程的消息队列中,因此您不会在WH_CALLWNDPROC中看到它(这是用于发送的消息)。WH_MOUSE确实收到了张贴的消息,所以我觉得有点奇怪,你看不到它……也许钩子只得到低级的鼠标输入消息?尝试使用WH_GETMESSAGE挂钩。
https://stackoverflow.com/questions/1042572
复制相似问题