VC模擬鼠標的兩種方式(SendMessage、mouse_event)


鼠標模擬的常用方案,包括發送鼠標事件消息和使用mouse_event系統函數,發送鼠標消息的例子如下:

pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);

這種方法不需要窗體在前端,甚至最小化也可以使用,但是此方法並不是在所有場合有效,特別是對於不響應鼠標消息的程序更是如此。在這種情況下,可以嘗試使用mouse_event函數。
首先給出mouse_event函數的原型:

VOID mouse_event(      

    DWORD dwFlags,
    DWORD dx,
    DWORD dy,
    DWORD dwData,
    ULONG_PTR dwExtraInfo
);

mouse_event有五個參數,第 一個為選項標志,為MOUSEEVENTF_LEFTDOWN時表示左鍵按下為MOUSEEVENTF_LEFTUP表示左鍵松開,向系統發送相應消息;第二、三個參數分別表示模擬鼠標對應x,y的位置,需要注意測是該參數對應的是屏幕坐標;第四、五個參數並不重要,一般也可設為0,0。若要得到Keybd_event和mouse_event函數的更詳細的用法,可以查閱msdn。
mouse_even只能夠發送前台消息,即僅對當前激活的窗體有效。t最好配合SetCursorPos(x,y)函數一起使用,首先調用SetCursorPos函數設置鼠標位置到需要模擬鼠標操作的位置,然后調用mouse_event模擬鼠標操作,下面是關於mouse_event的示例代碼:

POINT lpPoint;
GetCursorPos(&lpPoint);
SetCursorPos(lpPoint.x, lpPoint.y);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
示例代碼表示鼠標的雙擊,若要表示單擊,用兩個mouse_event即可(一次放下,一次松開)。

上面說明了模擬鼠標操作的兩種常用方法,下面再給出一個綜合實例進行闡述說明:

//在發送按鍵消息前需要設置下鼠標位置,掃雷程序似乎是根據鼠標位置
//確定點擊的方塊的,而不是鼠標消息的參數
//所以PostMessage在這里也不可以使用
::SetCursorPos(x,y);
//判斷是否是雷,不是雷才執行鼠標點擊動作
if(MineInf[acol*row+arow]==1){
    /*::mouse_event(MOUSEEVENTF_RIGHTDOWN,x,y,0,0);
    ::mouse_event(MOUSEEVENTF_RIGHTUP,x,y,0,0);	*/
    pWnd->SendMessage(WM_RBUTTONDOWN,0,(y<<16)|x);
    pWnd->SendMessage(WM_RBUTTONUP,0,(y<<16)|x);
}else{
    /*::mouse_event(MOUSEEVENTF_LEFTDOWN,x,y,0,0);
    ::mouse_event(MOUSEEVENTF_LEFTUP,x,y,0,0);*/				
    pWnd->SendMessage(WM_LBUTTONDOWN,0,(y<<16)|x);
    pWnd->SendMessage(WM_LBUTTONUP,0,(y<<16)|x);
}				

好了,這就是目前使用最多的VC程序進行鼠標事件模擬的兩種方案,讀者可以根據實際情況選擇使用。


免責聲明!

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



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