如何在WPF屏幕上获取鼠标位置?
它在一个特定的控件中工作,但它不能解决特定的控制问题。如何在WPF屏幕上获取鼠标位置?
如何获取鼠标位置和使用鼠标事件独立于任何控制只是直接从屏幕(没有平台调用)?
2所需的点:
- 鼠标事件时鼠标不是控制内的,但在屏幕上。
- 当鼠标不在控件内而是在屏幕上时的鼠标位置。
应该在不使用平台调用的情况下解决。
下一步两个不工作:
System.Windows.Input.Mouse.GetPosition(this)
没有得到鼠标的位置了特定的控制。
System.Windows.Forms.Cursor.Position.X
System.Windows.Forms.Cursor.Position
不起作用,因为它有一个WPF应用程序没有类型,但它工作在Windows窗体应用程序。
智能感知得到System.Windows.Forms.Cursor.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
表示当前坐标 视觉系统到屏幕坐标点的Point转换。
事情是这样的:
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
返回一个点,而PointToScreen
转换点到屏幕坐标
编辑:
可以使用Mouse.Capture(SepcificControl);
。From MSDN
捕获鼠标输入到指定的元素。
它没有解决特定的控制问题。 我的应用程序没有窗口,它通过鼠标在后台绘制,而用户使用鼠标执行其他操作。 它只是复制鼠标移动。 如果没有Platform Invoke是不可能的,请告诉我。 这个问题没有回答。 –
@ZiyaCeferov:对不起,对于迟到的回复,但是你可以使用'Mouse.Capture(SpecificControl);'为你的任务 –
是的,它的工作原理很棒。解决了两个问题之一,另一个问题:如何直接在屏幕上使用没有特定控件的鼠标事件?我可以使用无尽的线程或计时器来解决它,但我问:有没有像我们使用控件一样的现成方法? –
我没有什么新的发现,
代码如下,最前一页构建和运行窗口,
然后就轮窗口上单击鼠标一次调用环形的屏障检测鼠标的位置。
(因此我没有发现检测到鼠标事件出了问题,第二点的控制方式,但类似用途无尽的线程。)
但我只是用一个小技巧,使Windows.Forms在WPF项目中,只需使用纯方法中的表单代码,然后在事件代码块中引用该方法。
。
下面的代码:
添加两个引用项目:
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>
类代码:
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();
}
}
它确实没有制定一个控制。这不是解决方案。 –
您可以将它用于包含所有控件的主控件,例如'UserControl'或'Window' –
是的,但在我的情况下,当鼠标移出窗口时,我会画一个窗口。 我的目标是用鼠标在背景上画一个窗口,当用户移动鼠标做别的事情时。 如果不可能,请告诉我。 –