2015-04-23 9 views
10

Он работает в пределах определенного элемента управления, но не определяет конкретный элемент управления.Как получить положение мыши на экране в WPF?

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

2 Нужные точки:

  1. события мыши, когда мышь не в контроле, но на экране.
  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); 

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

ответ

9

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

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

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

+0

Это делает не выработайте контроль. Это не решение. –

+0

Вы можете использовать его для основного управления, охватывающего все элементы управления, например. 'UserControl' или' Window' –

+0

Да, но в моем случае я рисую окно, когда мышь выходила из окна. Моя цель - нарисовать окно на фоне мыши, когда пользователь перемещает мышь, делая что-то еще. Если это невозможно, сообщите мне. –

8

Вы можете использовать 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

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

+0

Это не работает определенный контроль. Мое приложение не имеет окна, оно рисует в фоновом режиме мышью, а пользователь использует мышь, чтобы сделать что-то еще. Он просто копирует перемещения мыши. Если это невозможно без Платформы Invoke, дайте мне знать. Вопрос не ответил. –

+0

@ZiyaCeferov: - Извините за поздний ответ, но да вы можете использовать 'Mouse.Capture (SpecificControl);' для вашей задачи –

+0

Да, это работает, отлично. Одна из двух проблем решена, а как насчет другой: как использовать события мыши без конкретных элементов управления непосредственно на экране? Я могу решить это, используя бесконечный поток или таймер, но я спрашиваю: есть ли готовый способ, как мы с элементами управления? –

1

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

код ниже, 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(); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^