如何在屏幕上获取当前鼠标坐标?
我只知道Mouse.GetPosition()
获取了元素的鼠标位置,但我想在不使用元素的情况下获得协调。
答案 0 :(得分:64)
跟进Rachel的回答。
这里有两种方法可以在WPF中获得鼠标屏幕坐标。
1.使用Windows窗体。添加对System.Windows.Forms的引用
public static Point GetMousePositionWindowsForms()
{
System.Drawing.Point point = Control.MousePosition;
return new Point(point.X, point.Y);
}
2.使用Win32
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetCursorPos(ref Win32Point pt);
[StructLayout(LayoutKind.Sequential)]
internal struct Win32Point
{
public Int32 X;
public Int32 Y;
};
public static Point GetMousePosition()
{
Win32Point w32Mouse = new Win32Point();
GetCursorPos(ref w32Mouse);
return new Point(w32Mouse.X, w32Mouse.Y);
}
答案 1 :(得分:63)
或者在纯WPF中使用PointToScreen。
示例助手方法:
// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
return _window.PointToScreen(Mouse.GetPosition(_window))
}
答案 2 :(得分:26)
您想要相对于屏幕或应用程序的坐标吗?
如果它在应用程序中,只需使用:
Mouse.GetPosition(Application.Current.MainWindow);
如果没有,我相信您可以添加对System.Windows.Forms
的引用并使用:
System.Windows.Forms.Control.MousePosition;
答案 3 :(得分:18)
如果您在不同的分辨率,具有多个显示器的计算机等上尝试了很多这些答案,您可能会发现它们无法可靠地工作。这是因为您需要使用变换来获取相对于当前屏幕的鼠标位置,而不是包含所有监视器的整个查看区域。像这样......(“这个”是WPF窗口)。
var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
var mouse = transform.Transform(GetMousePosition());
public System.Windows.Point GetMousePosition()
{
System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
return new System.Windows.Point(point.X, point.Y);
}
答案 4 :(得分:4)
无需使用表单或导入任何DLL即可运行:
using System.Windows;
using System.Windows.Input;
/// <summary>
/// Gets the current mouse position on screen
/// </summary>
private Point GetMousePosition()
{
// Position of the mouse relative to the window
var position = Mouse.GetPosition(Window);
// Add the window position
return new Point(position.X + Window.Left, position.Y + Window.Top);
}
答案 5 :(得分:1)
您可以使用TimerDispatcher(WPF计时器模拟)和Windows&#34; Hooks&#34;的组合。从操作系统中捕捉光标位置。
SpringApplication
点是轻型 [DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT pPoint);
。它只包含X,Y字段。
struct
此解决方案也可以解决问题,过于频繁或过于频繁的参数读取,因此您可以自行调整。但请记住WPF方法重载,其中一个arg表示 public MainWindow()
{
InitializeComponent();
DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer();
dt.Tick += new EventHandler(timer_tick);
dt.Interval = new TimeSpan(0,0,0,0, 50);
dt.Start();
}
private void timer_tick(object sender, EventArgs e)
{
POINT pnt;
GetCursorPos(out pnt);
current_x_box.Text = (pnt.X).ToString();
current_y_box.Text = (pnt.Y).ToString();
}
public struct POINT
{
public int X;
public int Y;
public POINT(int x, int y)
{
this.X = x;
this.Y = y;
}
}
而不是ticks
。
milliseconds
答案 6 :(得分:1)
如果您要寻找1班轮,这很好。
new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
答案 7 :(得分:0)
我将其添加为用于控件
private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };
}
答案 8 :(得分:0)
Mouse.GetPosition(mWindow)
为您提供鼠标相对于您选择的参数的位置。
mWindow.PointToScreen()
将位置转换为相对于屏幕的点。
因此,mWindow.PointToScreen(Mouse.GetPosition(mWindow))
为您提供了相对于屏幕的鼠标位置,假设mWindow
是一个窗口(实际上,从System.Windows.Media.Visual
派生的任何类都将具有此功能),如果您在WPF窗口类中使用它,this
应该可以工作。