Autor Beitrag
ASMFreak
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 9



BeitragVerfasst: Mo 10.12.12 13:00 
Hallo,

ich benutze die Klasse Process in .Net, um einen Prozess zu starten. Das funktioniert auch wie erwartet. Sofern ich damit einen GUI-Prozess starte, ist dank Process.SendInput auch alles in Ordnung: ich kann kommunizieren.
Ich vewende Process aber auch, um Konsolenprogramme zu starten. Hier hilft mir SendInput nicht weiter, da ich Input und Output des Konsolenprozesses umleiten muss.
Vor .Net hatte ich eine Process-ähnliche Klasse entwickelt, in der ich - so wie es Process-intern wohl auch erfolgt - über StartInfo den StdInput und StdOutput umgeleitet hatte; dazu hatte ich Pipes erzeugt, deren Handles ich der StartInfo-Struktur übergeben hatte. Wichtig dabei: ich hatte auf diese Weise ein Input-Handle.
Process wird, wie gesagt, wohl nicht anders vorgehen, und so wird es die beiden Handles hier auch geben, allerdings gut gekapselt und, zumindest sehe ich das so, wohl von außen nicht zugänglich - so habe ich trotzt intensiven Suchens keinen Zugang gefunden (oder habe ich den übersehen?). Zumindest das Input-Handle brauche ich aber, um die API-Funktion
ausblenden Delphi-Quelltext
1:
WriteCondoleInput					
aufrufen zu können, die meine Probleme lösen würde - hoffe ich zumindest, denn im früheren Ansatz war das nicht nötig und wurde daher nicht versucht. Denn JdeBP hat in seiner Antwort unter stackoverflow.com/qu...hild-console-windows geäußert, dass Konsolen wohl zwischen Informationen aus Pipes und Events unterscheiden, die über StdInput hereinkommen, und vertritt die Meinung, dass selbst wenn man das StdInut-Handle hätte, WriteConsoleInput wohl wegen der Pipe nicht funktioniert; er meint:
Zitat:
That's fairly difficult within .NET

Ich habe bislang zu häufig Äußerungen des Inhalts "Das geht nicht" gehört, und dann ging's doch! Daher folgende Fragen:
  • Hat jemand Erfahrung mit Konsolen, Process und .Net? Konnte der dieses Dilemma lösen? Und, wenn ja, wie?
  • Kann jemand die "Unmöglichkeit" der Nutzung von WriteConsoleinput mit einem "Pipe-Handle" (woher immer das auch kommen könnte) bestätigen? Dann nämlich verwerfe ich diesen Ansatz sofort.
  • Hat jemand eine Ahnung, wie man in Process an die umgeleiteten Handles herankommt?
  • Gibt es eine Möglichkeit, umgeleitete Handles eines Prozesses nach dessen Start zu ermitteln?
  • Gibt es eine Alternative zu WriteConsoleInput, mit der man gleiches erreicht (es geht um das Senden von Tastaturinformationen, also ScanCodes oder virtual keys, nicht um Text; das geht mit Process sehr gut!), bei der aber nicht das Input-Handle eines Prozesses erforderlich ist (sondern vielleicht "nur" ein Process-Handle - denn das ist über Process.ID leicht ermittelbar)?

Die Fragen zielen darauf ab, dass ich es nicht für besonders sinnvoll und erstrebenswert halte, das Rad neu zu erfinden und Process neu zu programmieren, nur weil ein Handle gekapselt ist. Wenn es also einen Weg gäbe, WriteConsoleInput zu nutzen, würde ich den gerne gehen. Ansonsten eine Alternative, so vorhanden.
Was mögliche Vorschläge betrift: SendMessage/PostMessage sind hier keine Lösung, da Konsolenprozesse nicht unbedingt ein Fenster besitzen, an das man Messages senden könnte ...

Bin für jeden konstruktiven Tip dankbar.
Gruß,
Trutz

_________________
Und aus dem Chaos sprach eine Stimme zu mir: Lächle und sei froh, es könnte schlimmer kommen.
Und ich lächelte und ich war froh – und es kam schlimmer!