Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 21.08.10 22:18 
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: www.pinvoke.net/defa...px/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!

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
BenBE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 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: www.delphi-forum.de/viewtopic.php?t=93676

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
BenBE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.