Ich habe daran gearbeitet, Eingaben in eine WPF-Anwendung zu injizieren. Was dieses Projekt schwierig macht, ist, dass ich in der Lage sein muss, die Eingabe in die Anwendung zu injizieren, obwohl sie im Hintergrund läuft (d. H. Eine andere Anwendung hat den Eingabefokus). Die Verwendung der SendInput() Funktion ist daher nicht in Frage.Mauseingabe in WPF-Anwendungen injizieren
Bis jetzt habe ich Tastatureingabe funktioniert, aber habe Probleme beim injizieren Mauseingabe.
Ich verwendete Spy ++, um die Fenstermeldungen zu beobachten, die an das WPF-Fenster gesendet werden, wenn ich die Maustaste physikalisch klicke. Ich fertige dann einfach dieselben Mausnachrichten (z. B. WM_LBUTTONDOWN
und WM_LBUTTONUP
) manuell an und sende sie explizit an das WPF-Fenster, um die Mauseingabe zu emulieren.
Leider funktioniert das nicht wie erwartet (nicht einmal wenn ich zu Testzwecken das WPF-Fenster als Vordergrundfenster eingestellt habe).
Ich habe eine Schaltfläche zu meinem WPF-Testfenster hinzugefügt, die nach dem Anklicken ein Meldungsfeld anzeigt. Das Einfügen der entsprechenden Mausnachrichten, wenn ich den Cursor manuell über die Schaltfläche positioniert habe, bewirkt jedoch nicht, dass auf die Schaltfläche geklickt wird (d. H. Das angeklickte Ereignis wird nicht vom WPF-Framework ausgelöst).
Wenn ich einen Handler für Mausklicks auf dem tatsächlichen Dialog (der Client-Bereich) hinzufügen, dass Handler tut aufgerufen, wenn ich den Cursor über den Dialog selbst positionieren und injizieren die gleichen Fenstermeldungen wie zuvor:
Seltsamerweise, wenn ich den Push-Modus der Schaltfläche zu drücken (dh es gilt als Klick auf die Maus nach unten anstatt die Standard-Maus nach oben), die Taste angeklickt Ereignis ausgelöst wird, wenn ich die gleichen Nachrichten wie zuvor injizieren. (Es ist erwähnenswert, dass der Handler aus dem obigen Beispiel korrekt für beide Maus-Downs und Ups abfeuert, so scheint es, dass das WPF-Framework beide Nachrichten erfolgreich verarbeitet.)
Es scheint, als gäbe es einige andere Kriterien, die müssen erfüllt sein, damit ein angeklicktes Mausereignis vom WPF-Framework ausgelöst wird. Weiß jemand, wie die Mauseingabe intern in WPF gehandhabt wird, oder warum sie meine Maus-Auf- und -Abmeldungen nicht als Klick auf die Schaltfläche interpretiert?
(Es ist erwähnenswert, dass dieser Ansatz [sending window messages] funktioniert gut auf gewöhnlichen Win32-Windows, wie der Start -> Ausführen-Dialog. Der Unterschied hier ist, dass WPF hat nur ein physisches Win32-Fenster und der Rest ist WPF spezifisch , was bedeutet, dass alle Fenstermeldungen zu diesem Fenster der obersten Ebene anstatt der eigentlichen Schaltfläche gehen.)
Ich habe High und Low für eine Antwort zu diesem Thema gesucht und würde beliebige Gedanken oder Ideen schätzen.
Je nach Anforderung kann es sich lohnen, die Benutzeroberflächenautomatisierung zu betrachten, anstatt zu versuchen, Eingaben zu simulieren. Aber das hängt sehr stark davon ab, was Sie versuchen, Input * für * zu injizieren - es ist eher ein Steuerelement-Level-Zeug als ein Pixel-Level-Zeug ... – itowlson
Ja, und es gibt verschiedene Ebenen der UI-Automatisierung: http : //blogs.msdn.com/ivo_manolov/archive/2008/12/15/9223397.aspx Ich habe bereits in TestAPI untersucht, um die Eingabe zu injizieren/zu automatisieren, aber unglücklicherweise verwenden sie SendInput() eher unter der Haube als einfach die Eingabe direkt in den WPF-Rahmen zu injizieren. – dreijer
Entschuldigung für Nekroskopie, aber jetzt mit der Referenzquelle von .NET zur Verfügung, kann dies tiefer geschaut werden https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Primitives/ButtonBase.cs , 414 –