wake-up-neo.com

Wie bekomme ich die Mausposition auf dem Bildschirm in WPF?

Es funktioniert innerhalb eines bestimmten Steuerelements, aber das spezifische Steuerelement funktioniert nicht.

Wie bekomme ich die Mausposition und verwende Mausereignisse unabhängig von jeder Steuerung direkt vom Bildschirm aus (ohne Platform Invoke)?

2 benötigte Punkte:

  1. Mausereignisse, wenn sich die Maus nicht in einem Steuerelement, sondern auf einem Bildschirm befindet.
  2. Mausposition, wenn sich die Maus nicht innerhalb eines Steuerelements befindet, sondern auf einem Bildschirm.

Es sollte ohne Platform Invoke gelöst werden.

Die nächsten beiden funktionieren nicht:

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

Bekommt die Mausposition nicht aus einem bestimmten Steuerelement heraus.

System.Windows.Forms.Cursor.Position.X

System.Windows.Forms.Cursor.Position funktioniert nicht, da es in einer WPF-App keine Typen gibt, aber in einer Windows Forms-App.

IntelliSense ruft System.Windows.Forms.Cursor.Position ab, erhält jedoch keine Art von Position. Daher kann ich Folgendes nicht erhalten:

Position.X    
Position.Y

und

Point pointToWindow = Mouse.GetPosition(this);

Point pointToScreen = PointToScreen(pointToWindow);

Bekommt die Mausposition nicht aus einem bestimmten Steuerelement heraus.

13
Ziya Ceferov

Mit dem MouseDown-Ereignis eines Steuerelements können Sie Folgendes versuchen:

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

EDIT: Sie können Mausereignisse mithilfe von Mouse.Capture(YourControl); für ein bestimmtes Steuerelement erfassen, sodass Mausereignisse erfasst werden, auch wenn sie sich nicht in diesem Steuerelement befinden. Hier ist der Link

12

Sie können PointToScreen verwenden.

Konvertiert einen Punkt, der das aktuelle Koordinatensystem von .__ darstellt. Visuell in einen Punkt in Bildschirmkoordinaten.

Etwas wie das:

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

Beachten Sie, dass Mouse.GetPosition einen Punkt zurückgibt und PointToScreen den Punkt in die Bildschirmkoordinate konvertiert

EDIT:

Sie können die Mouse.Capture(SepcificControl); verwenden. Von MSDN

Erfasst die Mauseingabe für das angegebene Element.

8
Rahul Tripathi

Ich habe wenig Neues gefunden,

Code ist unten, fisrt baut und führt das Fenster aus. 

bewegen Sie dann einfach die Maus einmal im Fenster, um die endlose Bildschirmerkennung der Mausposition aufzurufen.

(Daher habe ich im zweiten Punkt der Frage keinen Weg gefunden, um Mausereignisse außerhalb des Steuerelements zu erkennen, aber ähnlich verwenden Sie einen endlosen Thread.)

Ich benutze aber nur ein wenig Geschick, um Windows.Forms in WPF Project zu aktivieren, indem Sie einfach den Forms-Code in der pure-Methode verwenden und dann diese Methode im Event Code Block referenzieren.

.

Hier ist der Code:

Fügen Sie dem Projekt zwei Referenzen hinzu:

System.Drawing 
System.Windows.Forms

Xaml-Teil:

<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>

Klassencode:

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