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:
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.
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
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.
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();
}
}