Entwickler-Ecke

Sonstiges (.NET) - Fremdes GUI fernsteuern (UDK)


BenBE - Sa 21.08.10 22:18
Titel: Fremdes GUI fernsteuern (UDK)
Hi,

ich weiß, dass die Frage so ne Mischung aus "WinAPI", "Native/UnmanagedCode" und "Pfui, das macht man nicht" als Antwort ergeben wird, aber ich frag's trotzdem mal hier. Die Lösung für das Problem mit der WinAPI allein (also pures Delphi) wäre zwar auch ausreichend, da es aber für ein C#-Programm verwendet werden soll, ist das glaube der kürzere Weg.

Aber gut, zum Thema: Für ein Projekt, für das das Unreal Developement Kit verwendet wird, ist es wünschenswert, innerhalb des UDK-Editors eine Reihe von Kommandos auszuführen, für die Kismet (Untertool des Editors) gestartet werden muss. Problematisch hieran ist, dass die reine Verwendung von SendKeys nicht ohne Weiteres möglich ist, da einige Modifier je nach Kontext eine unterschiedliche Bedeutung haben und man daher nicht in jedem Fall mit Alt+Irgendwas ins Menü kommt. Der benötigte Menüeintrag im Menü hat allerdings leider auch keinen Shortcut.

Wir haben auch schon fieberhaft in der Doku des UDKs nach Ausweich-Möglichkeiten gesucht, aber bisher als einzig gangbaren Weg die Nutzung von FindWindow(Ex) in Verbindung mit SendKeys identifizieren können: Also weder Kommandozeilen-Optionen, noch irgendwo andere Schnittstellen zum Fernsteuern (COM/DCOM/XPCOM/ActiveX).

Was ich daher bräuchte, wären folgende Infos:
1. Ich hatte im WinAPI-Forum für Delphi letztens mal ne "Start&Wait"-Funktion geschrieben. Eine Übersetzung für C# wäre klasse (Brauchen wir für den Fall das UDK läuft nicht).

2. Jemand ne Idee, wie man in einer Fremdanwendung anhand des Handles eines Menüitems (oder dessen Command) diesen auslöst?
Alternativ: Generischer Weg, das Menü zu aktivieren, so dass man SendKeys nutzen kann.

3. Ein wenig Code, wie man recht günstig Fenster-Hierarchien abklappern kann um Unterfenster zu finden. Soviel ich gesehen hab, kann man da ja mit FindWindow(Ex) recht gut operieren: http://www.pinvoke.net/default.aspx/user32.findwindow

Hauptpunkt hier ist aber weniger das reine FindWindow/SendKeys (das ist weitestgehend klar), sondern der Punkt bzgl. der Menüzeile und dem Ausführen des Menü-Befehls.

P.S.: Ich bin derzeit auf der Suche nach dem Accessibility Explorer, der in früheren Versionen des Platform SDKs (Microsoft) mit enthalten war. Der konnte Menü-Strukturen auslesen und die nötigen Commands mit anzeigen. Ein wenig Code, wie ich mit den so gewonnenen Menu-CommandIDs den Item auslösen könnte, wäre recht hilfreich.

P.P.S.: Ich weiß, die Nutzung von Native Code widerstrebt .NET irgendwie etwas. Geht hier aber AFAIK nicht anders. Wenn doch UND es für den gewünschten Zweck funktioniert, nehm ich aber auch Managed-Lösungen.

Vielen Dank im Voraus!


Martok - Sa 21.08.10 22:57

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
2. Jemand ne Idee, wie man in einer Fremdanwendung anhand des Handles eines Menüitems (oder dessen Command) diesen auslöst?

AFAIR müsste das auf eine WM_SYSCOMMAND oder WM_APPCOMMAND oder so ähnlich hinauslaufen...

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ: Generischer Weg, das Menü zu aktivieren, so dass man SendKeys nutzen kann.

Alt-F10 aktiviert das Menü...
Ansonsten Alt-Space für das Sys-Menü, einmal rechts gibt dann auch das normale MainMenü. Wenn es denn eins ist, in Firefox funktioniert das z.B. anders.


BenBE - Sa 21.08.10 23:38

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
2. Jemand ne Idee, wie man in einer Fremdanwendung anhand des Handles eines Menüitems (oder dessen Command) diesen auslöst?

AFAIR müsste das auf eine WM_SYSCOMMAND oder WM_APPCOMMAND oder so ähnlich hinauslaufen...

Laut dem alten, neuen Ding [http://blogs.msdn.com/b/oldnewthing/archive/2006/03/02/542115.aspx] müsste das ein WM_COMMAND sein. WM_SYSCOMMAND nur für Items im System-Menü.

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ: Generischer Weg, das Menü zu aktivieren, so dass man SendKeys nutzen kann.

Alt-F10 aktiviert das Menü...
Ansonsten Alt-Space für das Sys-Menü, einmal rechts gibt dann auch das normale MainMenü. Wenn es denn eins ist, in Firefox funktioniert das z.B. anders.

Alt+F10 funzt bei mir nicht (mit Notepad getestet). Alt+Space geht zwar, ist aber recht unschön. Grundlegend wäre das aber durchaus ne Idee, wenn das WM_COMMAND doch wider Erwarten nicht gehen sollte.

Bliebe noch der Punkt bzgl. dem StartAndWait offen. Da jemand ne Idee, wie man das managed gelöst bekommt? Ich mein den Thread hier: http://www.delphi-forum.de/viewtopic.php?t=93676


Christian S. - So 22.08.10 00:06

Zu StartAndWait würde ich mir mal die Responding-Eigenschaft und die WaitForInputIdle-Methode der Process-Klasse angucken. Ich habe es nicht ausprobiert, aber es hört sich so an, als ginge es in die richtige Richtung ;-)


BenBE - So 22.08.10 03:13

k, werd ich auf jeden Fall mal schauen. Ist beim UDK durchaus wichtig, weil das Teil auch auf aktuellen Rechnern gern mal ne Minute zum Starten brauch ...

Aber bzgl. dem Menü-Kommando senden (Alternative zu SendMessage) hast jetzt auch keine Idee, oder?