zoukankan      html  css  js  c++  java
  • 获得鼠标离开消息。

    要知道什么时候一个鼠标指针进入一个窗口或是在它上面移动是非常简单的,因为窗口会接收到WM_MOUSEMOVE消息.在Windows NT 4.0中初次亮相的::TrackMouseEvent函数使得确定什么时刻鼠标指针离开窗口或者是静止悬于窗口上变得同样的简单.该函数在Windows 98中也是支持的.通过使用::TrackMouseEvent,一个应用程序能够注册为当鼠标指针离开一个窗口时接收到WM_MOUSELEAVE消息,当鼠标指针悬于窗口上时接收到WM_MOUSEHOVER消息.

    ::TrackMouseEvent仅仅接收一个参数:一个指向TRACKMOUSEEVENT结构体的指针.该结构体在Winuser.h中定义为:

    typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize;
    DWORD dwFlags;
    HWND hwndTrack;
    DWORD dwHoverTime;
    } TRACKMOUSEEVENT;

    cbSize保存者该结构体的大小.dwFlags估存着一些位标志,它指明了调用者想要干些什么:注册为接收WM_MOUSELEAVE消息(TME_LEAVE),注册为接收WM_MOUSEHOVER消息(TME_HOVER),取消WM_MOUSELEAVE和WM_MOUSEHOVER消息(TME_CANCEL),或者是让系统用当前的::TrackMouseEvent设定来填定TRACEMOUSEEVENT结构体的各个字段的值(TME_QUERY).hwndTrack是产生WM_MOUSELEAVE和WM_MOUSEHOVER消息的窗口的名柄.dwHoverTime是一个以毫秒为单位的时间值,它指明了鼠标指针必须静止多长时间才会有一个WM_MOUSEHOVER消息发送给它下面的窗口.

    鼠标指针并不一定需要绝对的静止才会产生一个WM_MOUSEHOVER消息.如果鼠标指针停留在以SPI_GETMOUSEHOVERWIDTH为参数调用::SystemParametersInfo函数所得到的值为长,以SPI_GETMOUSEHOVERHEIGHT为参数调用::SystemParametersInfo函数所得到的值为宽的矩形内,并且它的停留毫秒数超过了以SPI_GETMOUSEHOVERTIME为参数调用::SystemParametersInfo所返回的值时,一个WM_MOUSEHOVER消息就会产生.如果你需要,你可以通过使用SPI_SETHOVERWIDTH,SPI_SETHOVERHEIGHT和SPI_SETHOVERTIME为参数调用::SystemParametersInfo函数来改变这些值.

    ::TrackMouseEvent更有意思的是,当一个WM_MOUSELEAVE或者WM_MOUSEHOVER消息产生时,它的作用便消失了.这就意味着如果你想在鼠标指针离开窗口或者是悬停于窗口上方的任意时候都收到这些消息,你必须在接收到WM_MOUSELEAVE或者WM_MOUSEHOVER消息后再一次调用::TrackMouseEvent.举例来说,下面的代码片断实现了无论何时当一个鼠标指针进入,离开或者悬停于一个窗口上时,都会向调试窗口输出"Mouse enter,""Mouse leave,"或者"Mouse hover"信息.m_bMouseOver是一个BOOL类型的CMainWindow成员变量.它应当在构造函数中被设定为FALSE.

    // In the message map
    ON_WM_MOUSEMOVE ()
    ON_MESSAGE (WM_MOUSELEAVE, OnMouseLeave)
    ON_MESSAGE (WM_MOUSEHOVER, OnMouseHover)


    void CMainWindow::OnMouseMove (UINT nFlags, CPoint point)
    {
    if (!m_bMouseOver) {
    TRACE (_T ("Mouse enter/n"));
    m_bMouseOver = TRUE;

    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof (tme);
    tme.dwFlags = TME_HOVER | TME_LEAVE;
    tme.hwndTrack = m_hWnd;
    tme.dwHoverTime = HOVER_DEFAULT;
    ::TrackMouseEvent (&tme);
    }
    }

    LRESULT CMainWindow::OnMouseLeave (WPARAM wParam, LPARAM lParam)
    {
    TRACE (_T ("Mouse leave/n"));
    m_bMouseOver = FALSE;
    return 0;
    }

    LRESULT CMainWindow::OnMouseHover (WPARAM wParam, LPARAM lParam)
    {
    TRACE (_T ("Mouse hover (x=%d, y=%d)/n"),
    LOWORD (lParam), HIWORD (lParam));

    TRACKMOUSEEVENT tme;
    tme.cbSize = sizeof (tme);
    tme.dwFlags = TME_HOVER | TME_LEAVE;
    tme.hwndTrack = m_hWnd;
    tme.dwHoverTime = HOVER_DEFAULT;
    ::TrackMouseEvent (&tme);
    return 0;
    }
  • 相关阅读:
    Windbg对过滤驱动DriverEntry函数下断点技巧
    SSDT Hook实现简单的进程隐藏和保护【转载】
    驱动调试技巧:调试信息输出控制宏
    WinAPI【远程注入】三种注入方案【转】
    MFC 中控件的启用与禁用
    DLL注入之SetWindowsHookEx
    DLL注入之注册表
    RootKit学习之 IDT Hook
    Win7下判断当前进程是否以管理员身份运行
    Dalvik和ART
  • 原文地址:https://www.cnblogs.com/Dennis-mi/p/3370074.html
Copyright © 2011-2022 走看看