鼠標模擬的常用方案,包括發送鼠標事件消息和使用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程序進行鼠標事件模擬的兩種方案,讀者可以根據實際情況選擇使用。