1

大概是.NET的代码

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

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

Cursor.Position那么在没有成功更改的情况下,我将如何处理呢?.NET 是否提供了始终将光标移动到指定位置的某种保证?

UPD:问题是我已经有一个很小的 ​​C++ 程序,可以使用SetCursorPos. 问题是它不会每次都移动光标。我对 C++ 的熟练程度不足以调试此案例,因此我决定在 .NET 中重写它以查看差异。

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

4

3 回答 3

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.
}

虽然我怀疑这是必要的。

于 2013-05-06T21:57:11.140 回答
1

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

框架包装 WinApi 调用并在不重新抛出的情况下捕获异常。

于 2013-05-06T21:57:44.390 回答
1

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

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

.NET 是否提供了始终将光标移动到指定位置的某种保证?

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

当然,另一种选择是自己 PInvoke ,如果方法返回SetCursorPos,则调用。GetLastErrorfalse

于 2013-05-06T21:58:50.993 回答