如何在光标离开窗口检测

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
Microsoft Windows NT 4.0、 Windows 2000 和 Microsoft Windows 98 提供 TrackMouseEvent API 来鼠标已离开窗口, 通知窗口。 Windows 95 不提供任何这样的通知。 当鼠标退出窗口通过鼠标进入窗口, 时启动计时器和使用该计时器来监视鼠标位置和当它不再是窗口中查找应用程序可检测。 

示例代码

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>
   #if(_WIN32_WINNT < 0x0400)
   #define WM_MOUSELEAVE   WM_USER+2
   #define TME_LEAVE               1

   typedef struct tagTRACKMOUSEEVENT {
       DWORD cbSize;
       DWORD dwFlags;
       HWND  hwndTrack;
   } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

   VOID CALLBACK
   TrackMouseTimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime) {
      RECT rect;
      POINT pt;

      GetClientRect(hWnd,&rect);
      MapWindowPoints(hWnd,NULL,(LPPOINT)&rect,2);
      GetCursorPos(&pt);
      if (!PtInRect(&rect,pt) || (WindowFromPoint(pt) != hWnd)) {
         if (!KillTimer(hWnd,idEvent)) {
            // Error killing the timer!
         }

         PostMessage(hWnd,WM_MOUSELEAVE,0,0);
      }
   }

   BOOL
   TrackMouseEvent(LPTRACKMOUSEEVENT ptme) {
      OutputDebugString(TEXT("TrackMouseEvent/n"));

      if (!ptme || ptme->cbSize < sizeof(TRACKMOUSEEVENT)) {
         OutputDebugString(TEXT("TrackMouseEvent: invalid "
                                "TRACKMOUSEEVENT structure/n"));
         return FALSE;
      }

      if (!IsWindow(ptme->hwndTrack)) {
         OutputDebugString(
            TEXT("TrackMouseEvent: invalid hwndTrack/n"));
         return FALSE;
      }

      if (!(ptme->dwFlags & TME_LEAVE)) {
         OutputDebugString(TEXT("TrackMouseEvent: invalid dwFlags/n"));
         return FALSE;
      }

      return SetTimer(ptme->hwndTrack, ptme->dwFlags,
                      100,(TIMERPROC)TrackMouseTimerProc);
   }
   #endif

   LRESULT CALLBACK
   MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
      TRACKMOUSEEVENT tme;
      static BOOL fInWindow;
      static BOOL fInMenu;
      switch (uMsg) {
         case WM_CREATE:
            fInWindow = FALSE;
            fInMenu = FALSE;
            return 0;

         case WM_MOUSEMOVE:
            if (!fInWindow) {
               fInWindow = TRUE;
               tme.cbSize = sizeof(TRACKMOUSEEVENT);
               tme.dwFlags = TME_LEAVE;
               tme.hwndTrack = hWnd;
               if (!TrackMouseEvent(&tme)) {
                  MessageBox(hWnd,
                             TEXT("TrackMouseEvent Failed"),
                             TEXT("Mouse Leave"),MB_OK);
               }
            }
         break;

         case WM_MOUSELEAVE:
            fInWindow = FALSE;
            if (!fInMenu)
               MessageBox(hWnd,TEXT("Elvis has left the building"),
                          TEXT("Mouse Leave"),MB_OK);
            break;
         case WM_ENTERMENULOOP:
            fInMenu = TRUE;
            break;

         case WM_EXITMENULOOP:
            fInMenu = FALSE;
            break;

         default:
            return DefWindowProc(hWnd,uMsg,wParam,lParam);
      }
      return FALSE;
   }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值