[轉貼][C#]mouse_event模擬點擊時坐標參數無效?!

2013年7月24日 星期三

轉貼自 http://www.cnblogs.com/leafyoung/archive/2007/06/29/799837.html

實現遠程屏幕控制必不可少的函數之一就是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 意見:

張貼留言