2011-06-13 1 views
7

Je souhaite déclencher un événement de souris (clic, mousedown ou mouseup) en cliquant n'importe où dans une fenêtre WPF et en le traduisant par une différence connue, par ex. cliquez sur x, y, augmentez l'événement click à x + 100, y + 100.Comment puis-je déclencher un événement de souris dans WPF/C# avec des coordonnées spécifiques?

Le problème sous-jacent est qu'il existe un moniteur d'affichage qui se déplace physiquement par rapport à un écran tactile superposé. Plutôt que de recalibrer l'écran tactile à chaque mouvement, j'aimerais ajouter le décalage de traduction à l'événement click.

J'ai regardé l'API Win32 pour mouse_event et sa fonction de remplacement, SendInput. J'avoue que je suis perdu car je ne suis pas très familier avec l'API.

Sûrement c'est un problème simple à résoudre, mais je ne trouve pas d'exemple de code n'importe où qui me mène à l'endroit où je peux mettre en œuvre une solution. Toute aide, pointeur ou exemple solide sur la façon d'ajouter ceci à mon code serait apprécié.

Merci Mark

+0

vous ne pouvez pas faire cet ajustement dans les gestionnaires? –

Répondre

8

API Win32 ne fonctionne pas avec WPF, ce link pourrait aider

// Copied the snippet of code from the link above, just to help future readers 
MouseEventArgs e = new MouseEventArgs(Mouse.PrimaryDevice, 0); 
e.RoutedEvent = Mouse.MouseEnterEvent; 

youUIElement.RaiseEvent(e); 
// Or 
InputManager.Current.ProcessInput(e); 
+0

Merci, Waleed, je pense que cela me pousse un peu plus loin sur la route. Ce que je ne comprends toujours pas, cependant, c'est comment faire la traduction. Où dois-je spécifier les nouvelles coordonnées du curseur traduit dans les arguments d'événement, e dans l'extrait ci-dessus. Une fois que les coordonnées sont définies, puisque je ne connais pas l'élément de l'interface utilisateur qui sera sous les nouvelles coordonnées (il ne s'agit peut-être que d'un espace vide), ProcessInput (e) le comprend-il automatiquement? Dois-je définir la stratégie de routage sur Tunneling ou faire autre chose? –

+2

Eh bien, vous devriez utiliser Event Bubbling pour attraper chaque événement spécifique soulevé sur un élément enfant. Une fois capturé, vous obtiendrez une référence à l'UIElement qui a déclenché l'événement, vous pouvez alors spécifier les nouvelles coordonnées et les transférer. pour détecter si les coordonnées sont en dehors de la zone client, essayez: if (this.Clip.Bounds.Bottom> newY || this.Clip.Bounds.Left> newX ne) où cela se réfère à votre fenêtre principale – Waleed

Questions connexes