是什么让GetCursorPos返回错误的坐标{0,0}?

时间:2010-04-15 18:41:55

标签: windows winforms winapi

我们看到应用程序在Server 2008(而不是R2)上运行时出现不良行为。这是一个WinForms应用程序,无论鼠标在屏幕上的什么位置,Control.MousePosition都返回{0,0} ... Control.MousePosition只是对Win32 api GetCursorPos()进行P / Invoke调用。

跟进:

我正在使用来自WinForms的Control.MousePosition,它调用GetCursorPos,我可以看到它肯定会忽略返回值。以另一种方式问我的问题,“什么可以导致GetCursorPos()突然开始返回FALSE,当它在同一个过程中只用了几毫秒?”

// From .NET Reflector....
public static Point get_MousePosition()
{
    NativeMethods.POINT pt = new NativeMethods.POINT();
    UnsafeNativeMethods.GetCursorPos(pt);
    return new Point(pt.x, pt.y);
}

我们的库中有一个控件,它调用SetWindowsHookEx为我们的整个进程挂钩WH_CALLWNDPROCRET。我对这段代码持怀疑态度,但是跟踪语句表明我们正在干净利落地进入这个代码。

我还应该寻找什么?

谢谢, 戴夫

3 个答案:

答案 0 :(得分:2)

事实证明,只有在64位Server 2008 R1上运行的/ LARGEADDRESSAWARE 32位应用程序才会发生这种情况。

答案 1 :(得分:1)

要找出问题所在,您应该添加一些错误检查。如果GetCursorPos返回false,请调用GetLastError,然后将结果值作为例外投放。

答案 2 :(得分:0)

不知道该怎么做,但我从来没有打过那个功能。我总是假设只有在控制中才会返回位置,但看起来我错了。

你试过Cursor.Position吗? (MSDN Link

**我应该补充一点,这个方法基本上在内部使用相同的代码,但它可能值得尝试。

System.Windows.Forms.Cursor.Current.Position

//returns this for me:
{X = 1941 Y = 535}
    Empty: {X = 0 Y = 0}
    IsEmpty: False
    X: 1941
    Y: 535