實現遠程屏幕控制必不可少的函數之一就是mouse_event(或者SendInput),這個函數可以用來模擬鼠標移動、單擊、雙擊等功能,但是描述這個函數的文檔可謂少之又少,幾段雷同的代碼轉來轉去就是沒有一些深入討論的,MSDN中描述也語焉不詳。在昨天試驗中發現一個問題,希望有研究的「同志」能夠幫我解答,^_^
在如下模擬鼠標單擊的代碼中,我希望在相對屏幕左上角(10, 10)的位置點擊一下:
int dx = 10 * 65535 / Screen.PrimaryScreen.Bounds.Width;int dy = 10 * 65535 / Screen.PrimaryScreen.Bounds.Height;
mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), dx, dy, 0, IntPtr.Zero);
mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), dx, dy, 0, IntPtr.Zero);
---
無論從哪個角度看,上面這段代碼也是沒啥問題的,過程相當簡單,首先進行坐標變換,然後兩次調用mouse_event模擬鼠標按下和彈起,然而,代碼的運行效果卻出乎我的意料,程序並沒有在(10, 10)的位置模擬鼠標單擊事件,而是在當前位置觸發鼠標單擊!
經過多次驗證,發現對於鼠標點擊而言,dx、dy這兩個參數好像不起作用,無論對這兩個參數設置什麼值,鼠標點擊事件永遠在當前位置觸發!
猜測:為什麼會這樣呢?一個比較合理的解釋是為了避免在界面上給用戶造成混淆,從而禁止了在非鼠標當前位置處觸發鼠標單擊事件!具體原因不詳!!!
引申:由於不能在任意位置觸發鼠標點擊事件,假如我有這麼一個需要:鼠標不移動,在(10,10)位置點擊一下!那我們應該怎麼辦呢?在上面假設成立的情況下我們是無法直接實現這個需求的,下面提供一個間接的方法:
1 POINT p = new POINT();
2 GetCursorPos(out p);
3
4 try
5 {
6 ShowCursor(false);
7 SetCursorPos(10, 10);
8
9 mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
10 mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
11 }
12 finally
13 {
14 SetCursorPos(p.X, p.Y);
15 ShowCursor(true);
16 }
17
在上面的代碼中,通過隱藏鼠標,最終將鼠標位置移動到最初位置並顯示解決這個問題,因為速度很快,用戶幾乎不會察覺!
0 意見:
張貼留言