web-dev-qa-db-fra.com

Comment obtenir la position de la souris à l'écran dans WPF?

Cela fonctionne dans un contrôle spécifique, mais cela ne règle pas le contrôle spécifique.

Comment obtenir la position de la souris et utiliser les événements de la souris indépendamment de tout contrôle directement à l’écran (sans Platform Invoke)?

2 points nécessaires:

  1. Événements de souris lorsque la souris ne se trouve pas dans un contrôle, mais sur un écran.
  2. Position de la souris lorsque la souris ne se trouve pas dans un contrôle, mais sur un écran.

Cela devrait être résolu sans utiliser Platform Invoke.

Les deux prochaines ne fonctionnent pas:

System.Windows.Input.Mouse.GetPosition(this)

Ne permet pas à la souris de positionner un contrôle spécifique.

System.Windows.Forms.Cursor.Position.X

System.Windows.Forms.Cursor.Position ne fonctionne pas car il n'y a pas de types dans une application WPF, mais cela fonctionne dans une application Windows Forms.

IntelliSense obtient System.Windows.Forms.Cursor.Position, mais ne reçoit aucun type de position. Par conséquent, je ne peux pas obtenir:

Position.X    
Position.Y

et

Point pointToWindow = Mouse.GetPosition(this);

Point pointToScreen = PointToScreen(pointToWindow);

Ne permet pas à la souris de positionner un contrôle spécifique.

13
Ziya Ceferov

En utilisant l'événement MouseDown d'un contrôle, vous pouvez essayer ceci:

var point = e.GetPosition(this.YourControl);

EDIT: Vous pouvez capturer un événement de la souris sur un contrôle spécifique à l'aide de Mouse.Capture(YourControl); afin qu'il capture les événements de la souris même s'il ne se trouve pas sur ce contrôle. Voici le lien

12

Vous pouvez utiliser PointToScreen

Convertit un point qui représente le système de coordonnées actuel du fichier Visuel dans un point en coordonnées d'écran.

Quelque chose comme ça:

private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
    var relativePosition = e.GetPosition(this);
    var point= PointToScreen(relativePosition);
    _x.HorizontalOffset = point.X;
    _x.VerticalOffset = point.Y;
}

Notez que Mouse.GetPosition renvoie un point et que PointToScreen convertit le point en coordonnées d'écran.

MODIFIER:

Vous pouvez utiliser le Mouse.Capture(SepcificControl);. De MSDN

Capture l'entrée de la souris dans l'élément spécifié.

8
Rahul Tripathi

J'ai peu de nouveau trouvé,

Le code est ci-dessous, construisez d'abord et exécutez la fenêtre, 

ensuite, faites simplement glisser votre souris une fois sur la fenêtre pour appeler la détection à l'écran sans fin de la position de la souris.

(Ainsi, je n'ai pas trouvé le moyen de détecter un événement de souris hors du contrôle dans le deuxième point de la question, mais utilisez un fil similaire.)

Mais je viens d'utiliser une petite compétence pour activer Windows.Forms dans le projet WPF, en utilisant simplement le code de formulaire dans la méthode pure, puis référez cette méthode dans le bloc de code d'événement.

.

Voici le code:

Ajoutez deux références au projet:

System.Drawing 
System.Windows.Forms

Partie Xaml:

<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        xmlns:g="clr-namespace:Gma.UserActivityMonitor;Assembly=Gma.UserActivityMonitor"
        Title="MainWindow" Height="350" Width="525" 
        MouseWheel="MainWindow_OnMouseWheel">
    <Grid>
       <TextBlock Name="TBK" /> 
    </Grid>
</Window>

Code de la classe:

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public void KeepReportMousePos()
        {
            //Endless Report Mouse position
            Task.Factory.StartNew(() =>
            {
                while(true){
                    this.Dispatcher.Invoke(
                        DispatcherPriority.SystemIdle,
                        new Action(() =>
                        {
                            GetCursorPos();
                        }));
                }
            });
        }
        public void GetCursorPos()
        {
            //get the mouse position and show on the TextBlock
            System.Drawing.Point p = System.Windows.Forms.Cursor.Position;
            TBK.Text = p.X + " " + p.Y;
        }

        private void MainWindow_OnMouseWheel(object sender, MouseWheelEventArgs e)
        {
            //invoke mouse position detect when wheel the mouse
            KeepReportMousePos();
        }
    }
0
yu yang Jian