Как получить текущую координацию мыши на экране?
Я знаю только Mouse.GetPosition()
, которые получают mousePosition элемента, но я хочу получить координацию без использования элемента.
Как получить текущие координаты экрана мыши в WPF?
Ответ 1
Проследить ответ Рэйчел.
Здесь два способа, которыми вы можете получить координаты экрана мыши в WPF.
1. Использование Windows Forms. Добавить ссылку на 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);
}
Ответ 2
Или в чистом WPF используйте PointToScreen.
Пример вспомогательного метода:
// Gets the absolute mouse position, relative to screen
Point GetMousePos(){
return _window.PointToScreen(Mouse.GetPosition(_window))
}
Ответ 3
Вам нужны координаты относительно экрана или приложения?
Если в приложении просто используется:
Mouse.GetPosition(Application.Current.MainWindow);
Если нет, я считаю, что вы можете добавить ссылку на System.Windows.Forms
и использовать:
System.Windows.Forms.Control.MousePosition;
Ответ 4
Если вы попробуете много этих ответов на разных разрешениях, компьютерах с несколькими мониторами и т.д., вы можете обнаружить, что они не работают надежно. Это потому, что вам нужно использовать преобразование, чтобы получить положение мыши относительно текущего экрана, а не всю область просмотра, которая состоит из всех ваших мониторов. Что-то вроде этого... (где "this" - это окно 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);
}
Ответ 5
Это работает без использования форм или импорта каких-либо 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);
}
Ответ 6
Вы можете использовать комбинацию TimerDispatcher (аналог таймера WPF) и Windows "Hooks", чтобы поймать положение курсора в операционной системе.
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT pPoint);
Точка - это легкая struct
. Он содержит только поля X, Y.
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;
}
}
Это решение также решает проблему со слишком частым или слишком редким чтением параметров, так что вы можете настроить его самостоятельно. Но помните о перегрузке метода WPF одним аргументом, представляющим ticks
не milliseconds
.
TimeSpan(50); //ticks
Ответ 7
Если вы ищете 1 вкладыш, это хорошо.
new Point(Mouse.GetPosition(mWindow).X + mWindow.Left, Mouse.GetPosition(mWindow).Y + mWindow.Top)
Ответ 8
я добавляю это для использования с элементами управления
private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var mousepos = new List<double> { e.GetPosition(ControlName).X, e.GetPosition(ControlName).Y };
}
Ответ 9
Mouse.GetPosition(mWindow)
дает вам положение мыши относительно параметра по вашему выбору. mWindow.PointToScreen()
преобразует положение в точку относительно экрана.
Таким образом, mWindow.PointToScreen(Mouse.GetPosition(mWindow))
дает вам положение мыши относительно экрана, предполагая, что mWindow
является окном. Если вы используете это внутри класса окна WPF, this
должно работать