【问题标题】:Can assigning to a Cursor.Position throw an exception?分配给 Cursor.Position 会引发异常吗?
【发布时间】:2013-05-06 21:49:25
【问题描述】:

大概是.NET的代码

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

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

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

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

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

【问题讨论】:

    标签: .net winapi


    【解决方案1】:

    那么当 Cursor.Position 没有成功改变的情况下,我该如何处理呢?

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

    .NET 是否提供一些保证总是将光标移动到指定位置?

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

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

    【讨论】:

    • "虽然不太可能" --- 我将添加一些我应该在最初添加的解释
    • @zerkms 我列出了这往往发生的主要原因 - 你需要这个做什么,是什么导致了失败?
    • 添加了更新日期。我不能说是什么原因造成的,失败是零星的:-(
    • @zerkms 我建议使用 PInvoke(或您的原始 C++ 项目)并检查 GetLastError - 它应该告诉您失败的原因,这可能有助于诊断和确定解决问题的最佳方法(即:只需调用再次等)
    • 是的,这实际上是个好主意。如果 .net 实现继续失败,我会试试这个
    【解决方案2】:

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

    虽然我怀疑这是必要的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多