Befehle an eine "aktive" Konsole senden
-
Hallo,
ich habe vor Befehle/Eingaben an eine Konsole zu senden die in meiner Applikation
gestartet wird. Eigentlich hätte ich gedacht das ich das realtiv einfach über
SendMessage() hinbekomme. Scheine mich da getäuscht zu habenBisher habe ich es so versucht,
HWND handle = ShellExecute(0, "open" , "c:\\windows\\system32\\cmd.exe", NULL, NULL, SW_SHOWNORMAL); // Sleep(500); SendMessage(handle, WM_SYSKEYDOWN, VK_RETURN, 0); SendMessage(handle, WM_SYSKEYUP, VK_RETURN, 0);
(Das Sleep war nur ein Test ob ich vielleicht einfach nur zu schnell war)
In meiner Konsole allerdings kommt nichts an.
Vielleicht noch zur Aufklärung. Ich starte mit dem Programm unter anderem einen VPN-Client der dann eine aus einer mySQL Table das Cert. sowie den Key holt diesen dynamisch an die Systempfade anpasst und dann mit diesen Parametern die openVPN.exe startet. Nur benötigt der Client danach noch ein PWD. Dieses allerdings DARF nicht in der config stehen. Deshalb muss nach dem starten der EXE noch etwas an die Konsole gesendet werden.
-
du bekommst bei ShellExecute afaik ein HINSTANCE - handle zurück und kein HWND...
-
Das erklärt einiges.
Wie sieht es mit CreateProcess aus? Oder gibt es Möglichkeiten über das gelieferte HINSTANCE an ein HWND zu kommen?Ich sehe die WinAPI und ich brauchen noch etwas bis wir Freunde werden
-
Warum schreibst Du keinen Batch File und startest diesen einfach per ShellExecute? Warum musst Du Tastatureingaben senden.
-
Hmm,
wenn ich dynamisch das Batchfile erstelle, dieses dann über ShellExecute starte,
dann startet Windows doch eine Konsole IN der eine Stapelverarbeitung verarbeitet wird.dir >> c:\ausgabe.txt ping google.de tracert google.de
wäre ja auch alles kein Problem. Wenn ich Batchdateien noch richtig in Erinnerung habe,
wird der Befehl ausgeführt (z.B. ping.exe ausgeführt) und NACH beenden des Aufrufs wird
der nächste "Befehl" im Stapel ausgeführt. (oder liege ich da falsch?)Wenn ich jetzt meine openVPN.exe starte. Dann wird das Programm nicht beendet. Das Programm
läuft bis zum "terminate". Somit würde also der nächste Befehl im Stapel doch gar nicht
mehr ausgeführt, nicht wahr?!? Oder hätte ich über ein Batch tatsächlich die Möglichkeit mit
einem Batch einem aufgerufenem Programm zu interagieren? Wäre mir neu aber habe mich Jahre
nicht damit nicht auseinander gesetzt.Zudem hätte ich die Möglichkeit wenn ich die Applikation über den C-Code ausführe auch somit
wieder sauber zu beenden. (Programm tot >> VPN tot) Muss aber nicht zwingend sein da hätte
ich andere Möglichkeiten. Nur wäre das die Ideale Lösung.Das Umleiten des Ein/Ausgabe Streams wären 120% da ich so aus eine sehr gute Fehleranalyse
anhand des Ausgabe direkt über meine Apllikation durchführen könnte. Nur ist das
für meinen aktuellen Wissensstand was solch enge Arbeit mit der WinAPI angeht noch
viel zu niedrig ist, habe ich das erstmal ausgeschloßen.Das senden an das Fenster über FindWindow() ist viel zu anfällig für User Fehler.
(Falscher Klick zur flaschen zeit funzt es schon nicht mehr)
Zudem egal ob ich Asbach 'Edit', eine leere Konsole oder WingCommander 3 starte.
Steht unter Vista im Fenstertitel immer der Systempfad der cmd.exe (c:\wind....)
Ist eine 2 Konsole auf haut er das Passwort da rein und die Folgen sprechen ja für
sich wenn das pwd dann dort landet.D.h. heißt für mich die verbleibende Lösung sollte ein MSG send über
SendMessage/ProcessMessage/InputMessage sein. Zudem halt der oben gennante Vorteil wenn ich
ein Handle auf die Anwendung habe.Jetzt weiß ich nur nicht wie ich an das Handle kommen soll wenn der return von ShellExecute()
nicht wie erhofft das hWnd liefert.Alternative Lösungsvorschläge sind gerne gesehen.
(openVPN libs bzw direkten QuellCode einbinden fällt leider auch raus)
Dies ist das letzte Problem welches mich unglaublich aufhält und damit
meine Beta_1 verhindert.