C++獲取鼠標位置及全局檢測鼠標行為


1、獲取鼠標位置(在屏幕的位置)

   CPoint m_mouse;

      GetCursorPos(&m_mouse);

2、 屏幕轉化為客戶端(控件的相對位置)& 客戶端位置轉化為屏幕位置

      ClientToScreen(this->m_hwnd,m_mouse);  //客戶端位置轉化為屏幕位置

      ScreenToClient(this->m_hwnd,m_mouse) ;  //屏幕轉化為客戶端

3、獲取控件關於在屏幕的位置

   CRect  rc  

  GetWindowRect(&rc);

4、檢測鼠標的action的方式多,自己用的多的是msdn上介紹的callback的鼠標鈎子(低級鈎子)函數來實現

    1> 、對鼠標進行的幾個全局變量進行聲明:

     將這部分放置在C++類的外部  

/*  
 全局變量和全局函數定義  
 設定一個鼠標低級鈎子變量
*/  


HHOOK mouse_Hook ;  
LRESULT CALLBACK LowLevelMouseProc ( INT nCode,
                                     WPARAM wParam, 
                                     LPARAM lParam
                                   );  
BOOL UninstallHook();  //卸載  
BOOL InstallHook();     //安裝

         2>、在構造函數中初始化

1 mouse_Hook=NULL;   //將鈎子NULL

        3>、在初始化函數中安裝Hook          

1 InstallHook()

       4>、在析構函數中添加

UninstallHook()

     5>、 在當前cpp的類外中定義聲明的三個函數

     

 1 BOOL InstallKbHook( )  
 2 {  
 3 
 4     if (mouse_Hook)   UninstallHook();  
 5     mouse_Hook = SetWindowsHookEx(WH_MOUSE_LL,
 6         (HOOKPROC)(LowLevelMouseProc), AfxGetApp()->m_hInstance, NULL);  
 7 
 8     return( mouse_Hook != NULL); 
 9 }  
10 
11 BOOL UninstallHook()  
12 {  
13 
14     BOOL jud = FALSE;  
15     if (mouse_Hook) {  
16         jud= UnhookWindowsHookEx(mouse_Hook );  
17         mouse_Hook = NULL;  //set NULL  
18     }  
19 
20     return jud;  
21 } 
22 
23 LRESULT CALLBACK LowLevelMouseProc (INT nCode, WPARAM wParam, LPARAM lParam)  
24 {  
25     CPoint  _mousepoint;
26     MSLLHOOKSTRUCT *pkbhs = (MSLLHOOKSTRUCT *)lParam;  
27     switch (nCode)  
30     {  
31 
32     case HC_ACTION:  
33         {  
34             //鼠標左擊  
35             if(wParam == WM_LBUTTONDOWN||wParam == WM_RBUTTONDOWN||wParam == WM_MBUTTONDOWN||wParam ==WM_LBUTTONUP||wParam ==WM_RBUTTONUP||wParam == WM_MBUTTONUP){  
36                     //獲取鼠標的位置,並進行必要的判斷
37                 
38                     //鼠標右鍵按下
39                 if(Mmdlg!=NULL){
40                     if(    Mmdlg->setingmenu!=NULL&& Mmdlg->bo_back!=1)
41                     {
42                         //如果鼠標不在當前客戶端位置之內
43                        GetCursorPos(&_mousepoint);
44                         CRect m_crect;
45                         //Mmdlg->setingmenu->GetClientRect(m_crect);
46                         Mmdlg->setingmenu->GetWindowRect(m_crect);
47                         //ScreenToClient(Mmdlg->setingmenu->m_hWnd,&m_crect);
48                         if(m_crect.bottom>_mousepoint.y && m_crect.top<_mousepoint.y &&
49                             m_crect.left<_mousepoint.x  && m_crect.right >_mousepoint.x
50                           ){
51                                 ;  //啥也不干
52                         }
53                         else{
54                             delete [] Mmdlg->setingmenu;
55                             Mmdlg->setingmenu=NULL;
56                         }
57                     }
58                     Mmdlg->bo_back=0;
59                 }
60             }
61         }
62     default:   break;  
63     }  
64 
65     return CallNextHookEx (NULL, nCode, wParam, lParam);  
66 }  

 

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM