2015-04-23 16 views
10

Funziona all'interno di un controllo specifico, ma non risolve il controllo specifico.Come ottenere la posizione del mouse sullo schermo in WPF?

Come ottenere la posizione del mouse e utilizzare gli eventi del mouse indipendentemente da qualsiasi controllo direttamente dallo schermo (senza Platform Invoke)?

2 Punti richiesti:

  1. eventi del mouse quando il mouse non è all'interno di un controllo, ma su uno schermo.
  2. Posizione del mouse quando il mouse non si trova all'interno di un controllo, ma su uno schermo.

Dovrebbe essere risolto senza utilizzare Platform Invoke.

prossimi due non funzionano:

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

non ottiene la posizione del mouse fuori un controllo specifico.

System.Windows.Forms.Cursor.Position.X 

System.Windows.Forms.Cursor.Position non funziona perché non ha i tipi in un'applicazione WPF, ma funziona in un Windows Form app.

IntelliSense ottiene System.Windows.Forms.Cursor.Position, ma non ottiene alcun tipo di posizione, quindi non riesco a:

Position.X  
Position.Y 

e

Point pointToWindow = Mouse.GetPosition(this); 

Point pointToScreen = PointToScreen(pointToWindow); 

Doesn ottenere la posizione del mouse su un controllo specifico.

risposta

9

Utilizzando MouseDown caso di un controllo si può provare questo:

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

EDIT: È possibile catturare evento del mouse a un controllo specifico utilizzando Mouse.Capture(YourControl); quindi sarà catturare gli eventi del mouse, anche se non è su quel controllo. Ecco la link

+0

lo fa non elaborare un controllo. Non è una soluzione. –

+0

Puoi usarlo per il controllo principale che racchiude tutti i controlli, ad es. 'UserControl' o' Window' –

+0

Sì, ma nel mio caso disegno su una finestra quando il mouse è fuori dalla finestra. Il mio obiettivo è disegnare su una finestra in background col mouse, quando un utente muove il mouse facendo qualcos'altro. Se è impossibile, fammi sapere. –

8

È possibile utilizzare PointToScreen

Converte un punto che rappresenta l'attuale sistema del visiva coordinata in un punto in coordinate dello schermo.

Qualcosa di simile a questo:

private void MouseCordinateMethod(object sender, MouseEventArgs e) 
{ 
    var relativePosition = e.GetPosition(this); 
    var point= PointToScreen(relativePosition); 
    _x.HorizontalOffset = point.X; 
    _x.VerticalOffset = point.Y; 
} 

notano che Mouse.GetPosition restituisce un punto, e PointToScreen converte il punto alla schermata coordinare

EDIT:

È possibile utilizzare la Mouse.Capture(SepcificControl);.Da MSDN

Cattura l'input del mouse sull'elemento specificato.

+0

Non funziona un controllo specifico. La mia app non ha finestre, disegna in background con il mouse, mentre un utente usa il mouse per fare qualcos'altro. Copia solo le mosse del mouse. Se è impossibile senza Platform Invoke, fammi sapere. Alla domanda non viene data risposta. –

+0

@ZiyaCeferov: - Ci scusiamo per la risposta in ritardo, ma sì, è possibile utilizzare 'Mouse.Capture (SpecificControl);' per il proprio compito –

+0

Sì, funziona, ottimo. Uno dei 2 problemi risolti, che ne è di un altro: come utilizzare gli eventi del mouse senza controlli specifici direttamente sullo schermo? Posso risolverlo usando thread infiniti o timer, ma chiedo: c'è un modo pronto come facciamo con i controlli? –

1

ho poco ritrovata,

codice è al di sotto, costruzione fisrt ed eseguire il Window,

poi basta ruota il vostro tempo del mouse uno sulla finestra per richiamare la schermata di infinita rilevare del mouse Posizione.

(Così non ho trovato il modo di rilevare evento del mouse fuori dal controllo nel secondo punto della questione, ma l'uso simile un filo senza fine.)

Ma mi basta usare un po 'di abilità per permettere Windows.Forms in WPF Project, semplicemente usa il codice di Forms in puro metodo, quindi riferisci quel metodo nel Event Code Block.

.

Ecco il codice:

Aggiungi due riferimenti al progetto:

System.Drawing 
System.Windows.Forms 

Xaml parte:

<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> 

Codice Classe:

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