Hallo liebe Experten,
folgendes Problem:
Ich habe auf meiner Platte ein pdf-Dokument liegen, das ich drucken möchte. Dies bewerkstellige ich so:
Dim pdfPfadDateiname as String
Dim psi As System.Diagnostics.ProcessStartInfo
Dim proc As Diagnostics.Process
pdfPfadDateiname = "MyDoc.pdf"
psi = New Diagnostics.ProcessStartInfo(pdfPfadDateiname)
psi.Verb = "print"
psi.WindowStyle = ProcessWindowStyle.Hidden
proc = New Diagnostics.Process
proc.StartInfo = psi
proc.Start()
proc.WaitForInputIdle(30000)
proc.CloseMainWindow
Das Dokument wird auch gedruckt, das Problem ist nur, dass der Acrobat Reader offen bleibt. Der Befehl „WaitForInputIdle“ wartet angeblich, bis das Fenster des Prozesses eingabebereit ist; das funktioniert aber nur, wenn ich kein Verb (hier: „print“) mitgebe. CloseMainWindow funktioniert erst dann, wenn das Fenster mal da ist, das Programm kommt aber zu früh zu diesem Befehl. Ich habe auch versucht, einen Loop um CloseMainWindow herum zu programmieren, bis das Fenster geschlossen wird - wird es aber auch nicht. Eine festgelegte Zeit über Threading.Thread.Sleep möchte ich eigentlich auch nicht warten, da es von der Gesamtsituation abhängt, wie lange der Start von Acrobat Reader tatsächlich dauert, und den Status des Startvorgangs kann ich auch nicht abfragen.
Mir sind inzwischen 2 Lösungsmöglichkeiten eingefallen, die mir aber beide nicht gefallen:
- Starten des Prozesses zum Drucken in einem eigenen Thread und dort über Sleep eine sichere Zeit warten.
- Drucken über einen Prozess, der Acrobat Reader als Zeilenbefehl startet (da kann ich als Parameter dann ein Drucken mit anschließendem Schließen des Readers mitgeben). Dazu muss ich aber erst den genauen Standort der Reader-.exe über die Registry ermitteln.
Langer Rede kurzer Sinn: hat jemand eine Idee, um mit einfachem Coding das Gewünschte zu erreichen?
Schöne Grüße
Thomas