Как получить положение мыши на экране в 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();
}
}