如何在 WPF 中获取鼠标在屏幕上的位置?
How to get mouse position on screen in WPF?
它在特定的控件内工作,但它不能解决特定的控件。
如何直接从屏幕(没有平台调用)独立于任何控件获取鼠标位置和使用鼠标事件?
2 需要点数:
- 鼠标不在控件内但在屏幕上时的鼠标事件。
- 鼠标不在控件内但在屏幕上时的鼠标位置。
不用Platform Invoke应该可以解决
接下来两个不工作:
System.Windows.Input.Mouse.GetPosition(this)
无法将鼠标位置移出特定控件。
System.Windows.Forms.Cursor.Position.X
System.Windows.Forms.Cursor.Position
不起作用,因为它在 WPF 应用程序中没有类型,但它在 Windows 表单应用程序中起作用。
IntelliSense 获取 System.Windows.Forms.Cursor.Position,但它没有获取任何类型的 Position,因此我无法获取:
Position.X
Position.Y
和
Point pointToWindow = Mouse.GetPosition(this);
Point pointToScreen = PointToScreen(pointToWindow);
无法将鼠标位置移出特定控件。
使用控件的 MouseDown
事件你可以试试这个:
var point = e.GetPosition(this.YourControl);
编辑:
您可以使用 Mouse.Capture(YourControl);
将鼠标事件捕获到特定控件,这样即使它不在该控件上,它也会捕获鼠标事件。这是 link
您可以使用PointToScreen
Converts a Point that represents the current coordinate system of the
Visual into a Point in screen coordinates.
像这样:
private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
var relativePosition = e.GetPosition(this);
var point= PointToScreen(relativePosition);
_x.HorizontalOffset = point.X;
_x.VerticalOffset = point.Y;
}
请注意Mouse.GetPosition
returns一个点,PointToScreen
将点转换为屏幕坐标
编辑:
您可以使用Mouse.Capture(SepcificControl);
。来自 MSDN
Captures mouse input to the specified element.
我没有什么新发现,
代码如下,首先构建和运行 Window,
然后只需在 window 上滚动鼠标一次即可调用鼠标位置的无限屏幕检测。
(因此我在问题的第二点没有找到检测鼠标事件不受控制的方法,但类似使用无限线程。)
但我只是用了一点技巧在 WPF 项目中启用 Windows.Forms,只需在纯方法中使用 Forms 代码,然后在事件代码块中引用该方法。
.
代码如下:
添加两个对项目的引用:
System.Drawing
System.Windows.Forms
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>
Class代码:
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();
}
}
为什么要把事情复杂化?只需传递 null
即可获取屏幕坐标:
private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
var screenPos = e.GetPosition(null);
// ...
}
它在特定的控件内工作,但它不能解决特定的控件。
如何直接从屏幕(没有平台调用)独立于任何控件获取鼠标位置和使用鼠标事件?
2 需要点数:
- 鼠标不在控件内但在屏幕上时的鼠标事件。
- 鼠标不在控件内但在屏幕上时的鼠标位置。
不用Platform Invoke应该可以解决
接下来两个不工作:
System.Windows.Input.Mouse.GetPosition(this)
无法将鼠标位置移出特定控件。
System.Windows.Forms.Cursor.Position.X
System.Windows.Forms.Cursor.Position
不起作用,因为它在 WPF 应用程序中没有类型,但它在 Windows 表单应用程序中起作用。
IntelliSense 获取 System.Windows.Forms.Cursor.Position,但它没有获取任何类型的 Position,因此我无法获取:
Position.X
Position.Y
和
Point pointToWindow = Mouse.GetPosition(this);
Point pointToScreen = PointToScreen(pointToWindow);
无法将鼠标位置移出特定控件。
使用控件的 MouseDown
事件你可以试试这个:
var point = e.GetPosition(this.YourControl);
编辑:
您可以使用 Mouse.Capture(YourControl);
将鼠标事件捕获到特定控件,这样即使它不在该控件上,它也会捕获鼠标事件。这是 link
您可以使用PointToScreen
Converts a Point that represents the current coordinate system of the Visual into a Point in screen coordinates.
像这样:
private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
var relativePosition = e.GetPosition(this);
var point= PointToScreen(relativePosition);
_x.HorizontalOffset = point.X;
_x.VerticalOffset = point.Y;
}
请注意Mouse.GetPosition
returns一个点,PointToScreen
将点转换为屏幕坐标
编辑:
您可以使用Mouse.Capture(SepcificControl);
。来自 MSDN
Captures mouse input to the specified element.
我没有什么新发现,
代码如下,首先构建和运行 Window,
然后只需在 window 上滚动鼠标一次即可调用鼠标位置的无限屏幕检测。
(因此我在问题的第二点没有找到检测鼠标事件不受控制的方法,但类似使用无限线程。)
但我只是用了一点技巧在 WPF 项目中启用 Windows.Forms,只需在纯方法中使用 Forms 代码,然后在事件代码块中引用该方法。
.
代码如下:
添加两个对项目的引用:
System.Drawing
System.Windows.Forms
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>
Class代码:
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();
}
}
为什么要把事情复杂化?只需传递 null
即可获取屏幕坐标:
private void MouseCordinateMethod(object sender, MouseEventArgs e)
{
var screenPos = e.GetPosition(null);
// ...
}