2015-04-23 117 views
10

它在一个特定的控件中工作,但它不能解决特定的控制问题。如何在WPF屏幕上获取鼠标位置?

如何获取鼠标位置和使用鼠标事件独立于任何控制只是直接从屏幕(没有平台调用)?

2所需的点:

  1. 鼠标事件时鼠标不是控制内的,但在屏幕上。
  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); 

隐而不宣不要把鼠标放在一个特定的控件上。

回答

9

使用MouseDown性事件的控制,你可以试试这个:

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

编辑: 可以使用Mouse.Capture(YourControl);所以它会捕获鼠标事件,即使是无法捕获鼠标事件到特定的控制在那个控制上。这里是link

+0

它确实没有制定一个控制。这不是解决方案。 –

+0

您可以将它用于包含所有控件的主控件,例如'UserControl'或'Window' –

+0

是的,但在我的情况下,当鼠标移出窗口时,我会画一个窗口。 我的目标是用鼠标在背景上画一个窗口,当用户移动鼠标做别的事情时。 如果不可能,请告诉我。 –

8

您可以使用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

捕获鼠标输入到指定的元素。

+0

它没有解决特定的控制问题。 我的应用程序没有窗口,它通过鼠标在后台绘制,而用户使用鼠标执行其他操作。 它只是复制鼠标移动。 如果没有Platform Invoke是不可能的,请告诉我。 这个问题没有回答。 –

+0

@ZiyaCeferov:对不起,对于迟到的回复,但是你可以使用'Mouse.Capture(SpecificControl);'为你的任务 –

+0

是的,它的工作原理很棒。解决了两个问题之一,另一个问题:如何直接在屏幕上使用没有特定控件的鼠标事件?我可以使用无尽的线程或计时器来解决它,但我问:有没有像我们使用控件一样的现成方法? –

1

我没有什么新的发现,

代码如下,最前一页构建和运行窗口,

然后就轮窗口上单击鼠标一次调用环形的屏障检测鼠标的位置。

(因此我没有发现检测到鼠标事件出了问题,第二点的控制方式,但类似用途无尽的线程。)

但我只是用一个小技巧,使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(); 
     } 
    }