Как получить положение мыши на экране в WPF?

Он работает в определенном элементе управления, но не выполняет конкретного элемента управления.

Как получить положение мыши и использовать события мыши независимо от любого элемента управления непосредственно с экрана (без вызова платформы)?

2 необходимые точки:

  • События мыши, когда мышь не находится внутри элемента управления, но на экране.
  • Положение мыши, когда мышь не находится в элементе управления, но на экране.

Он должен быть разрешен без использования Platform Invoke.

Следующие два не работают:

System.Windows.Input.Mouse.GetPosition(this)

Не выводит мышь из определенного элемента управления.

System.Windows.Forms.Cursor.Position.X

System.Windows.Forms.Cursor.Position не работает, поскольку он не имеет типов в приложении WPF, но работает в приложении Windows Forms.

IntelliSense получает System.Windows.Forms.Cursor.Position, но не получает никакого типа позиции, поэтому я не могу получить:

Position.X    
Position.Y

и

Point pointToWindow = Mouse.GetPosition(this);

Point pointToScreen = PointToScreen(pointToWindow);

Не выводит мышь из определенного элемента управления.

Ответ 1

Используя MouseDown событие элемента управления, вы можете попробовать следующее:

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

EDIT: Вы можете захватить событие мыши на конкретный элемент управления, используя Mouse.Capture(YourControl);, чтобы он захватывал события мыши, даже если он не находится в этом элементе управления. Вот ссылка

Ответ 2

Вы можете использовать PointToScreen

Преобразует точку, представляющую текущую систему координат Визуальный в точку в координатах экрана.

Что-то вроде этого:

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 преобразует точку в координату экрана

EDIT:

Вы можете использовать Mouse.Capture(SepcificControl);. Из MSDN

Захват ввода мыши в указанный элемент.

Ответ 3

У меня мало нового найдено,

Код ниже, fisrt построить и запустить окно,

то просто задвиньте мышь один раз в окне, чтобы вызвать бесконечное обнаружение экрана положения мыши.

(Таким образом, я не нашел способ обнаружить событие мыши вне контроля во второй точке вопроса, но аналогичный использовать бесконечный поток.) ​​

Но я просто использую небольшое умение, чтобы включить Windows.Forms в проекте WPF, просто используя код 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>

Код класса:

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();
        }
    }