2010-04-15 3 views
1

Nous observons un comportement incorrect dans une application lorsqu'elle est exécutée sur Server 2008 (et non R2). C'est une application WinForms, et Control.MousePosition retourne {0,0} peu importe où la souris est sur l'écran ... Control.MousePosition fait juste un appel P/Invoke à Win32 api GetCursorPos().Qu'est-ce qui pourrait faire que GetCursorPos renvoie des coordonnées incorrectes de {0,0}?

Followup:

Je me sers de Control.MousePosition WinForms, qui appelle GetCursorPos, et je peux voir qu'il ne tient pas compte certainement la valeur de retour. En posant ma question d'une autre manière, "Qu'est-ce qui fait que GetCursorPos() peut soudainement commencer à retourner FALSE, alors qu'il ne fonctionnait que quelques millisecondes auparavant dans le même processus?"

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

Il y a un contrôle dans notre bibliothèque qui appelle SetWindowsHookEx à accrocher WH_CALLWNDPROCRET pour notre ensemble du processus. Je me méfie de ce code, mais les instructions de traçage montrent que nous obtenons plus de ce hook proprement.

Que dois-je rechercher d'autre?

Merci, Dave

+0

Vérifiez-vous la valeur de retour de GetCursorPos, est-ce que cela échoue? Et pouvez-vous partager la déclaration P/Invoke, peut-être qu'il y a quelque chose qui ne va pas. –

+0

Appelez 'GetLastError()' si 'GetCursorPos()' renvoie 'false' et voit quelle est l'erreur. –

Répondre

2

Il s'avère que cela peut arriver avec les applications 32 bits/LARGEADDRESSAWARE fonctionnant sur 64 bits Server 2008 R1 seulement.

+1

Pouvez-vous citer votre source pour cette réponse? Est-ce que Microsoft vous a dit cela ou vous souvenez-vous comment vous l'avez compris? Y a-t-il une solution? J'utilise beaucoup GetCursorPos() et j'aimerais éviter tout problème potentiel comme celui-là. Merci – loop

0

Je ne sais pas ce qu'on pourrait faire, mais je ne l'ai jamais appelé cette fonction. J'ai toujours supposé qu'il ne restituait la position que s'il était sous contrôle, mais il semble que j'avais tort.

Avez-vous essayé Cursor.Position? (MSDN Link)

** Je devrais ajouter que cette méthode utilise le même code, fondamentalement, en interne, mais cela pourrait valoir la peine d'être essayé.

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

Pour savoir quel est le problème, vous devriez ajouter une vérification d'erreur. Si GetCursorPos renvoie false, appelez le GetLastError, puis lancez la valeur résultante en tant qu'exception.

Questions connexes