我们看到应用程序在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。我对这段代码持怀疑态度,但是跟踪语句表明我们正在干净利落地进入这个代码。
我还应该寻找什么?
谢谢, 戴夫
答案 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