Hi,
In einem der anderen Foren (ich glaube es war VBA) wurde geschrieben, dass man den AcrobatReader nach dem Drucken schließen kann, indem man per PostMessage WM_CLOSE an das Fenster sendet. Da die Anwendung und Suche nach Alternativen aber eher in die .NET-Programmierung passen, poste ich es hier.
Da Acrobat, wenn er noch am Drucken ist, die WM_CLOSE Meldung ignoriert (also nicht einmal in eine eigene Queue steckt um sie später zu verarbeiten), sind wir dort zu dem Schluss gekommen, dass man in einer Schleife so lange WM_CLOSE schicken soll, bis das Fenster weg ist.
[highlight=vbnet]
... ' pro ist hier der Acrobat-Prozess, mit dem gedruckt wird
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
Loop While Not pro.HasExited
[/highlight]
Das Problem, das nun aufgetreten ist, ist dass das Programm einen Fehler 1816 erhält, wenn es versucht WM_CLOSE abzusetzen. Tante Google sagt mir, dass dies daran läge, dass das Programm die Zahl von 10.000 Postmessages überschritten hätte (ich hatte den entsprechenden Hinweis auf MSDN nie gelesen, weil ich dachte der Betrifft nur Vista und höher, und hier arbeiten alle auf XP). Das Problem trat aber auch auf, als mein Programm frisch gestartet wurde und der Druckbefehl auch einen neuen Acrobat erzeugt hat.
Nun ist es zwar durchaus möglich, dass ich in die Schleife zum WM_CLOSE senden ein pro.WaitForExit(delay_ms) einbaue, um die PostMessages etwas auseinderzureissen, da das Problem aber anscheind auch bei "jungfräulichen" Programmstarts passiert, habe ich so meine Zweifel, ob das wirklich was bringt.
Gibt es da irgendwelche Möglichkeiten, festzustellen, ob Acrobat mit dem Drucken fertig ist, um den Acrobat-Prozess zu töten, wenn ich ihm keine PostMessages mehr senden kann? Die einzige Möglichkeit, die mir so auf Anhieb einfällt, wäre die Druckerschlange zu überwachen, bis "mein" Druckauftrag drin ist (identifiziert über Dateiname und User-Kennung des Druckjobs), aber mal davon abgesehen, dass ich nicht weiß, ob das dann nicht den Drucker oder das Netzwerk lahmlegt, da ständig nachzufragen, weiß ich auch nicht, ob ich überhaupt sofort reagieren darf, wenn der Auftrag auftaucht.
Hat jemand eine Idee, wie man Acrobat dazu bringen kann, den Abschluss des Drucks zurückzumelden, oder wie auf andere Weise von meinem Programm feststellbar ist, ob Acrobat fertig ist?
Gruß
Martin
In einem der anderen Foren (ich glaube es war VBA) wurde geschrieben, dass man den AcrobatReader nach dem Drucken schließen kann, indem man per PostMessage WM_CLOSE an das Fenster sendet. Da die Anwendung und Suche nach Alternativen aber eher in die .NET-Programmierung passen, poste ich es hier.
Da Acrobat, wenn er noch am Drucken ist, die WM_CLOSE Meldung ignoriert (also nicht einmal in eine eigene Queue steckt um sie später zu verarbeiten), sind wir dort zu dem Schluss gekommen, dass man in einer Schleife so lange WM_CLOSE schicken soll, bis das Fenster weg ist.
[highlight=vbnet]
... ' pro ist hier der Acrobat-Prozess, mit dem gedruckt wird
Dim hAcrobatWindow As IntPtr
Do
hAcrobatWindow = pro.MainWindowHandle
If PostMessage(hAcrobatWindow, WM_CLOSE, 0, 0) = 0 Then
clsLog.LogLine("PostMessage an AcrobatReader fehlgeschlagen:" & Err.LastDllError & " - " & Err.Description)
End If
Loop While Not pro.HasExited
[/highlight]
Das Problem, das nun aufgetreten ist, ist dass das Programm einen Fehler 1816 erhält, wenn es versucht WM_CLOSE abzusetzen. Tante Google sagt mir, dass dies daran läge, dass das Programm die Zahl von 10.000 Postmessages überschritten hätte (ich hatte den entsprechenden Hinweis auf MSDN nie gelesen, weil ich dachte der Betrifft nur Vista und höher, und hier arbeiten alle auf XP). Das Problem trat aber auch auf, als mein Programm frisch gestartet wurde und der Druckbefehl auch einen neuen Acrobat erzeugt hat.
Nun ist es zwar durchaus möglich, dass ich in die Schleife zum WM_CLOSE senden ein pro.WaitForExit(delay_ms) einbaue, um die PostMessages etwas auseinderzureissen, da das Problem aber anscheind auch bei "jungfräulichen" Programmstarts passiert, habe ich so meine Zweifel, ob das wirklich was bringt.
Gibt es da irgendwelche Möglichkeiten, festzustellen, ob Acrobat mit dem Drucken fertig ist, um den Acrobat-Prozess zu töten, wenn ich ihm keine PostMessages mehr senden kann? Die einzige Möglichkeit, die mir so auf Anhieb einfällt, wäre die Druckerschlange zu überwachen, bis "mein" Druckauftrag drin ist (identifiziert über Dateiname und User-Kennung des Druckjobs), aber mal davon abgesehen, dass ich nicht weiß, ob das dann nicht den Drucker oder das Netzwerk lahmlegt, da ständig nachzufragen, weiß ich auch nicht, ob ich überhaupt sofort reagieren darf, wenn der Auftrag auftaucht.
Hat jemand eine Idee, wie man Acrobat dazu bringen kann, den Abschluss des Drucks zurückzumelden, oder wie auf andere Weise von meinem Programm feststellbar ist, ob Acrobat fertig ist?
Gruß
Martin
Comment