可以赋值给Cursor.Position抛出异常吗?

时间:2013-05-06 21:49:25

标签: .net winapi

大概是.NET的代码

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

内部使用SetCursorPos() WINAPI函数,在某些情况下(根据documentation)可能会返回false

那么当Cursor.Position未成功更改时,我该如何处理? .NET是否始终保证将光标移动到指定位置?

UPD :问题是我已经有了一个小小的C ++程序,它使用SetCursorPos将光标移动到左下角。事实是它每次都不会移动光标。我在C ++中不够精通调试案例所以我决定在.NET中重写它以查看差异。

我需要它:运行一些测试(selenium webdriver)我需要一个鼠标光标不在浏览器窗口上,因为我手动发送测试用例中的鼠标事件,真正的光标会干扰它们。

3 个答案:

答案 0 :(得分: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.
}

虽然我怀疑这是必要的。

答案 1 :(得分:1)

根据与Cursor.Position相同的MSDN文档Cursor.MousePosition,不会抛出任何异常。

框架包装WinApi调用并捕获异常而无需重新抛出。

答案 2 :(得分:1)

  

那么当Cursor.Position未成功更改时,我将如何处理这种情况?

对此进行测试的唯一方法是在设置后立即尝试获取位置。

  

.NET是否始终保证将光标移动到指定位置?

只要移动光标的位置,Cursor.Position setter就会成功。没有办法保证这一点,因为Windows API可能会失败(尽管不太可能)。任何失败都可能是由于非标准环境造成的(有时VM会导致此问题,全屏Direct3D应用程序处于活动状态,或者屏幕保护程序正在运行)。

另一种选择当然是PInvoke SetCursorPos,如果方法返回GetLastError则调用false