首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局钩子中的WM_MOUSEHOVER

全局钩子中的WM_MOUSEHOVER
EN

Stack Overflow用户
提问于 2009-06-25 07:23:34
回答 1查看 1.6K关注 0票数 0

我已经为我的应用程序(MFC)中的几个控件实现了自定义工具提示,但我想使其适用于所有控件。

现在,我在WM_MOUSEMOVE中调用TrackMouseEvent,然后捕获WM_MOUSEHOVER (两者都在控件的重写函数WindowProc中)。但通过这种方式,我必须为每个控件复制代码。所以我的目的是为鼠标事件设置一个全局钩子,然后请求控件在工具提示中显示消息。

问题是我不能在全局钩子中捕获WM_MOUSEHOVER。代码如下:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
LRESULT CMyListBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
    if(message == WM_MOUSEHOVER)
    {
        AfxMessageBox(_T("WindowProc: WM_MOUSEHOVER"));
    }
    return CListBox::WindowProc(message, wParam, lParam);
}

好的。那么我错过了什么呢?在全局钩子中捕获此消息是不可能的?有没有其他方法可以做到这一点,而不需要在每个控件中都放入相同的代码?

谢谢。

哈维尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-25 12:27:05

WM_MOUSEHOVER被发布到线程的消息队列中,因此您不会在WH_CALLWNDPROC中看到它(这是用于发送的消息)。WH_MOUSE确实收到了张贴的消息,所以我觉得有点奇怪,你看不到它……也许钩子只得到低级的鼠标输入消息?尝试使用WH_GETMESSAGE挂钩。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1042572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档