| 

.NET C# Java Javascript Exception

1
Wir benutzen eine selbstgeschriebene Winform-Anwendung (VB.NET), die dynamisch erzeugte BatchFiles ausführt.

In den Batchfiles setzen wir mit dem Befehl "TITLE abc wird ausgeführt" die Titelzeile. Da immer mehrere Abschnitteso markiert werden, setzen wir also während des Jobs mehrfach die Kopfzeile neu.

Unsere Winform-Anwendung startet die Batch-Files per Process.Start

pProcess = Process.Start(pInfo)
pProcess.WaitForExit()


Nun möchten wir als neues Feature, in der Winform-Anwendung mitbekommen, wenn sich die Titelzeile ändert, damit wir dass entsprechend anzeigen können.

Gibt es daher eine Funktion/Methode, wie wir das mitbekommen können bzw. welches Event/Methode des Process-Objekts kann ich dafür nutzen?
02.05.2011
MyKey0815 1,6k 2 9
2 Antworten
1
Mir ist keine Methode dafür bekannt und ich würde mich wundern, wenn es eine gäbe ;-) Leider kann man bei einer Konsolenanwendung auch nicht über den Prozess auf das Anwednungsfenster zugreifen.

Ich hätte auf die schnelle aber einige Anregungen:

  • Du könntest gemeinsamen Speicher nutzen (Shared Memory), um die Titelzeile darin zu übertragen.
  • Du könntest es mit der Implementierung eines Remoteservers und -Clients versuchen (Geschwindigkeitsprobleme ließen sich ggf. über Arbeitsthreads lösen, die im Hintergrund die Remoteübertragung ausführen können)
  • Die aufgerufene Anwendung könnte den Titel in eine Datei schreiben und die aufrufende Anwendung verwendet einen FileSystemWatcher, um diese zu überwachen.

Diese Vorschläge sollen lediglich Anregungen sein, keine fertigen Lösungen, denn alle bereiten mir ein wenig Bauchschmerzen :-) Aber vielleicht fördern sie ja weitere Ideen.

Sollte es doch eine ganz einfache Möglichkeit geben (z.B. Windows-API, Windows-Hook o.ä.), würde ich einen Hinweis darauf ebenfalls begrüßen.
02.05.2011
Andreas Ganzer 1,4k 1 8
Ich denke in dem Fall, ist die Verwendung von einer Datei, in der der Titeltext steht am einfachsten zu realisieren ("echo blabla > text.txt").

Gebe dir recht, dass es nicht das "gelbe vom Ei ist", aber so wie es aussieht, ist es sonst nicht anders möglich solch eine Kommunikation aufzubauen
MyKey0815 03.05.2011
1
Hallo,

Ich habe ein wenig mit P/Invoke experimentiert. Als Ansatz (keine fertige Lösung) fällt mir ein:

DllImport("User32.dll")> _
Private Shared Function GetWindowText(ByVal hWnd As IntPtr, _
ByVal lpString As StringBuilder, _
ByVal nMaxCount As Integer) As Integer


Das erforderliche Window Handle erhältst Du mittels:
pProcess.MainWindowHandle

Allerdings ist mir kein Event bekannt auf den das Programm reagieren könnte. Und bezüglich Synchronisierung wird das wahrscheinlich eine ziemliche Bastelei.

Grüße
Maria
02.05.2011
Maria Simlinger 1,1k 1 9
Hallo Maria,

dieses Handle ist nicht gültig, wenn der gestartete Prozess keine GUI-Anwendung ist (http://msdn.microsoft.com/de-de/library/system.diagnostics.process.mainwindowhandle(v=VS.90).aspx).

Nichts für Ungut ;-)
Andreas Ganzer 03.05.2011
Ich habe pProcess.UseShellExecute dafür auf true gesetzt, und ("mit dem richtigen Timing" - das ist das Problem) ein gültiges Handle erhalten, sowie die Titelzeile der Command Shell ausgelesen und per Console.WriteLn im Main Process ausgegeben.

Grüße
Maria
Maria Simlinger 03.05.2011
Das klingt interessant. Ich habe über diesen Weg noch nie nachgedacht. Kannst Du das mit dem "Timing" vielleicht etwas näher erläutern?
Andreas Ganzer 08.05.2011
Ich meine damit: Man wird über einen Wechsel der Titelzeile nicht benachrichtigt (wie z. B. über einen Event), man muss regelmäßig abfragen. Sowie: Zu früh abgefragt hat sich vielleicht das Fenster des Batch noch nicht geöffnet und man erhält ein null-Handle, eine ms später nicht mehr, 1 ms zu spät null-Handle. Im ganzen nur ein sehr grober Ansatz, der - wie gesagt - Tüftelei erfordern würde.
Maria Simlinger 09.05.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH