2010-04-15 85 views
1

在Server 2008(不是R2)上運行時,我們發現應用程序中存在不良行爲。這是一個WinForms應用程序,無論鼠標在屏幕上的何處,Control.MousePosition都會返回{0,0} ... Control.MousePosition只是對Win32 api GetCursorPos()進行P/Invoke調用。什麼使GetCursorPos返回不正確的座標{0,0}?

跟帖:

我使用Control.MousePosition從的WinForms,它調用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

您是否檢查GetCursorPos的返回值,它可能失敗?你可以分享P/Invoke聲明,也許這裏有錯誤。 – 2010-04-15 18:45:49

+0

如果'GetCursorPos()'返回'false'並查看錯誤是什麼,調用'GetLastError()'。 – 2010-04-15 18:57:54

回答

2

事實證明,只有在64位Server 2008 R1上運行/ LARGEADDRESSAWARE 32位應用程序時纔會發生這種情況。

+1

你能舉出這個答案的來源嗎?微軟是否告訴過你這個問題,還是你記得你是如何計算出來的?有一些解決方案嗎?我使用GetCursorPos()很多,我想避免任何潛在的問題。謝謝 – loop 2013-05-13 23:07:29

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 
1

要找出問題所在,應該添加一些錯誤檢查。如果GetCursorPos返回false,請致電GetLastError,然後將結果值作爲例外。

相關問題