8
votes

Comment obtenir la position de la souris liée au bureau dans WPF?

problème

Lorsque vous recherchez une telle question à l'aide de Google, vous obtenez beaucoup de hits, mais toutes les solutions supposent que vous avez au moins une fenêtre.

Mais ma question est comme si je l'ai formellement formulée - pas des hypothèses du tout. Je peux avoir une fenêtre, mais je pourrais avoir zéro Windows (parce que je n'ai même pas montré qu'un ou je viens de fermer le dernier). Donc, en bref, la solution ne peut pas compter sur aucun widget ni fenêtre - la seule chose est connue, est qu'il y a un bureau (et une application en cours d'exécution, mais il n'a aucune fenêtre).

La question est donc - Comment obtenir la position de la souris?

Fond

Je voudrais montrer Windows centré sur la position de la souris. Il n'y a pas de tel mode dans WPF (il n'y a que le centre au propriétaire ou le centre à l'écran), donc je dois le faire manuellement. La pièce manquante est la position de la souris.

Edits

Merci à tous, alors maintenant, j'ai la première partie de la solution - la position brute. Maintenant, il y a un problème comment convertir les données pour WPF. J'ai trouvé un tel sujet: pixels WPF aux pixels de bureau Mais encore une fois, il suppose avoir une fenêtre.

Puis j'ai googlé plus et j'ai trouvé une solution: http://jerryclin.wordpress.com / 2007/11/13 / Création - Windows non rectangulaire-with-Interop /

Le code comprend la classe pour la mise à l'échelle des coordonnées UP / DOWN s'appuyant uniquement sur des informations sur le bureau. Alors joignant ces deux pièces, j'ai enfin la solution :-). Merci encore.


0 commentaires

3 Réponses :


4
votes

Deux options:

Utilisez system.windows.forms.control.mouseposition ou p / invoke xxx

la première option déjà Est-ce que le p / invoque pour vous? Je ne suis pas tout à fait sûr que cela nécessite que vous ayez une interruption de l'interface utilisateur, mais je ne le pense pas. Oui, ses winforms et non WPF, mais cela n'a pas vraiment rien à voir avec où il est situé à.

Si vous souhaitez sauter des dépendances sur System.Windows.Forms.dll, puis vérifiez < Un href = "http://www.pinvoke.net/default.aspx/user32.gecursorpos" rel = "nofollow"> Plus d'informations sur la seconde sur Pinvoke.net .


1 commentaires

Merci, j'utilise le deuxième itinéraire car il n'a pas besoin d'ajouter de nouvelles références, j'ai utilisé le code présenté par MBursill.



21
votes

Obtenir les coordonnées de l'écran: xxx pré>

convertir des pixels en unités WPF: p> xxx pré>

Mettre les deux ensemble: p>

private void WriteMouseCoordinatesInWPFUnits()
{
    POINT p;
    if (GetCursorPos(out p))
    {
        Point wpfPoint = ConvertPixelsToUnits(p.X, p.Y);
        System.Console.WriteLine(Convert.ToString(wpfPoint.X) + ";" + Convert.ToString(wpfPoint.Y));
    }
}


3 commentaires

Merci, mais c'est la moitié du problème - maintenant, j'ai des coordonnées à l'écran en pixels et non dans des unités WPF. Je ne peux pas utiliser Poindromscreen parce que pour cela, j'ai besoin d'un widget. Alors, comment convertir des pixels en unités uniquement? Y a-t-il une méthode pour cela?


J'ai ajouté le code pour montrer comment les pixels peuvent être convertis en unités WPF, sans avoir à avoir une fenêtre déjà affichée. Il existe également une méthode de WPF intégrée (sur n'importe quel WPF visuel) appelé PointFromscreen, cependant, vous devez avoir un visuel ci-joint pour que cela fonctionne.


point wpfunits = nouveau point (physicyunitsize * (double) x, physicyunitsize * (double) y); doit être remplacé par point wpfunits = nouveau point (double) x / physicyunitsize, (double ) Y / physicyunitsize); pour fixer l'écran de l'écran



0
votes

J'ai trébuché sur ce fil pendant la recherche d'une solution pour le même problème. En attendant, j'ai trouvé pointetoscreen , qui ne nécessite aucun p / invoke. La méthode est disponible sur tout Visual Démarrage 3.0 (et donc uielement , Contrôle , etc.) et une implémentation ressemblerait à ceci: xxx


0 commentaires