Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 分配给游标位置是否会引发异常?_.net_Winapi - Fatal编程技术网

.net 分配给游标位置是否会引发异常?

.net 分配给游标位置是否会引发异常?,.net,winapi,.net,Winapi,大概是.NET的代码 Cursor.Position = new Point(x, y); 内部使用SetCursorPos()WINAPI函数,该函数(根据)在某些情况下可能返回false 那么,当Cursor.Position未成功更改时,我将如何处理这种情况?NET是否为始终将光标移动到指定位置提供了一些保证 uPD>强>:我已经有了一个微小的C++程序,它使用 SETCURSORPOS将光标移到左下角。问题是它不会每次都移动光标。我在C++调试中不够熟练,所以我决定在.NET中重写

大概是.NET的代码

Cursor.Position = new Point(x, y);
内部使用
SetCursorPos()
WINAPI函数,该函数(根据)在某些情况下可能返回
false

那么,当
Cursor.Position
未成功更改时,我将如何处理这种情况?NET是否为始终将光标移动到指定位置提供了一些保证

<强> uPD>强>:我已经有了一个微小的C++程序,它使用<代码> SETCURSORPOS将光标移到左下角。问题是它不会每次都移动光标。我在C++调试中不够熟练,所以我决定在.NET中重写它,看看有什么不同。


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

我已经试过了,如果您尝试将位置设置为不在屏幕上的位置(即
新点(-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.
}

尽管我怀疑这是必要的。

根据与相同的MSDN文档,不会引发任何异常

框架包装WinApi调用并捕获异常,而无需重试

那么,当光标位置未成功更改时,我将如何处理这种情况

唯一的方法,甚至测试这是试图得到的立场后,立即设置它

NET是否为始终将光标移动到指定位置提供了一些保证

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


当然,另一种选择是自己使用PInvoke
SetCursorPos
,如果方法返回
false
,“尽管可能性很小”,则调用
GetLastError
”——我将添加一些我应该添加的解释initially@zerkms我列出了发生这种情况的主要原因-你为什么需要它,失败的原因是什么?添加了一个更新。我不能说是什么原因,失败是零星的:-(@ ZekMMS,我建议使用pJoCKE(或您的原始C++项目)和检查GETLASTOrror——它应该告诉您为什么它失败,这可能有助于诊断和确定解决问题的最佳方法(即:再次调用)等。是的,这实际上是个好主意。如果.net实现继续失败,我会试试这个