2013-05-06 33 views
1

想必.NET代碼可以分配給Cursor.Position引發異常嗎?

Cursor.Position = new Point(x, y); 

在內部使用SetCursorPos() WINAPI函數,它(按documentation)在某些情況下可能會返回false

那麼如何處理Cursor.Position尚未成功更改的情況呢? .NET是否提供了一些保證,將光標移動到指定位置?

UPD:事情是我已經有一個很小的C++程序,使用SetCursorPos將光標移動到左下角。而且每次都不移動光標。我沒有足夠的精通C++來調試案例,所以我決定在.NET中重寫它以查看差異。

我需要什麼:運行一些測試(硒webdriver)我需要一個鼠標光標不在瀏覽器窗口,因爲我手動發送鼠標事件在測試用例和一個真正的光標干擾他們。

回答

1

那麼當Cursor.Position沒有被成功改變時,如何處理這種情況呢?

甚至爲此測試的唯一方法是在設置後立即獲取位置。

.NET是否提供了一些保證,可以隨時將光標移動到指定位置?

Cursor.Position設置者應該在任何時候光標的位置都可以移動。沒有辦法保證這一點,因爲Windows API可能會失敗(儘管極不可能)。任何失敗都可能是由於非標準環境造成的(有時虛擬機可能導致此問題,全屏Direct3D應用程序處於活動狀態或屏幕保護程序正在運行)。

另一種替代方法當然是PInvoke SetCursorPos,如果方法返回false,則調用GetLastError

+0

「雖然極不可能」 ---我會添加一些說明,我應該補充最初 – zerkms 2013-05-06 22:00:13

+0

@zerkms我列出的主要理由這往往發生 - 你需要這個什麼,和什麼原因造成的失敗? – 2013-05-06 22:01:17

+0

添加了更新。我不能說是什麼原因導致的失敗都是零星:-( – zerkms 2013-05-06 22:02:05

1

我已經嘗試過了,如果您嘗試將位置設置爲不在屏幕上的位置(即new Point(-1, -1)),.NET似乎會安全地處理問題。

如果要檢查位置確實變了,你可以這樣做:

Point oldPos = Cursor.Position; 
Cursor.Position = new Point(x, y); 
if (oldPos == Cursor.Position) 
{ 
    // cursor position not set 
} 

雖然這可能不是在大多數情況下的錯誤。我不知道可能會發生什麼其他問題,但如果你真的擔心它,你可以隨時使用try-catch塊:

try { 
    Cursor.Position = new Point(x, y); 
} 
catch (Exception ex) 
{ 
    // Unable to set cursor position. 
} 

雖然我懷疑這將是必要的。