Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Reagieren auf das Schließen des Adobe Reader Druckfensters

Frage Entwicklung Visual Studio

Mitglied: Mesaou

Mesaou (Level 1) - Jetzt verbinden

28.01.2015, aktualisiert 29.01.2015, 1032 Aufrufe, 10 Kommentare

Ich hatte vor kurzem das Problem mit dem AxAcroPDF-Steuerelement aus VS2013 Express zu drucken, dank eurer Hilfe konnte ich das Problem lösen. Jetzt stehe ich vor einem Folgeproblem und zwar möchte ich, dass nach dem Druck von einem oder mehereren Druckern (jeweils über das Druckfenster vom Adobe Reader) das Dokument noch in einem "Archiv-Ordner" abgelegt wird. Das Problem ist, dass ich im Moment entweder eine Messagebox einbauen muss und dann mit dem nächsten Druck warte bis die Messagebox mit OK beendet wurde oder den kompletten Druckvorgang einfach überspringe und die PDF-Datei einfach direkt verschiebe. Ich würde gerne auf das Schließen des Druckfensters vom Adobe Reader reagieren habe aber leider weder hier noch im restlichen Netz was genaueres dazu gefunden. Ich habe mir auch den Taskmanager schonmal angeschaut nur taucht da leider nichts gesondertes auf, während das Druckfenster offen ist. Die AcroRd32.exe ist vorher schon offen da ich in meinem Programm, aus dem heraus ich drucke, das AxAcroPDF-Steuerelement verwende. Könnte mir bitte jemand das Brett vorm Kopf wegnehmen?

Grüße
Mesaou
Mitglied: Mesaou
29.01.2015 um 11:10 Uhr
So hab mir gestern den Link noch angeschaut und heute noch weiter mit überlegt. Ich glaube aber dass er mein Problem nicht ganz abdeckt. Vielleicht habe ich mein Problem nicht genau genug beschrieben.
Der Ablauf ist folgendermaßen:

- Es wird mit einem PDF-Drucker ein PDF erstellt und in einem bestimmten Ordner abgelegt
- Sobald in dem bestimmten Ordner eine PDF-Datei erzeugt wird springt mein Programm an, lädt die Datei in das AxAcroPDF-Steuerelement und zeigt alle Drucker die auf dem System installiert sind an (diese kann man mittels einer Checkbox anwählen)
- Nun hat der User zwei Möglichkeiten zum drucken:

- Direktdruck:
Dokument wird von alle gewählten Druckern in der gewünschten Anzahl aus und verschiebt die Datei in den "Archiv-Ordner" sofern die entsprechende Checkbox gesetzt ist, ansonsten wird das Dokument gelöscht. Diese Funktion funktioniert bereits.

- Druck mit Einstellungen:
Es wird das Druckfenster des AdobeReaders angezeigt (und nur dieses es wird also kein AdobeReader Fenster geöffnet) aktuell wird auch noch eine Messagebox geöffnet. Sobald diese geschlossen wird geht das Programm zum nächsten ausgewählten Drucker und öffnet für diesen das Druckfenster. Dieser Vorgang wird wiederholt bis alle gewählten Drucker angezeigt wurden. Als letztes wird das Dokument ins Archiv verschoben sofern die Checkbox gesetzt ist, ansonsten wird das Dokument gelöscht. Die Messagebox wird benötigt, weil das Programm ansonsten nicht auf das Beenden der Druckaufträge/fenster wartet und direkt bis zum Archivieren/Löschen weiter geht. Danach wird der streamtoprint geschlossen und damit auch das Druckfenster (weitere Druckfenster werden erst garnicht geöffnet). Ich würde jetzt gerne diese Messagebox umgehen und stattdessen den nächsten Druck automatisch anstoßen sobald der letzte Druck fertig ist bzw eine bestimmte Zeit nachdem das Druckfenster geschlossen wurde. die AxAcroPDF.Print()-Methode ist leider zum einen Void und ist sofort beendet auch wenn der Druck noch nicht abgeschlossen ist (Adobe Documentation: This method returns immediately, even if the printing has not completed.)
Bitte warten ..
Mitglied: 114757
LÖSUNG 29.01.2015, aktualisiert um 14:04 Uhr
Dann bleibt dir noch die Druckerwarteschlange des Druckers zu überwachen (z.B. via WMI) ...
Bitte warten ..
Mitglied: Mesaou
29.01.2015, aktualisiert um 15:38 Uhr
Danke für den Tipp, jetzt funktionierts. Hab im Netz ne einfache Möglichkeit zum auslesen der Druckerwarteschleife gefunden (http://www.vbarchiv.net/tipps/tipp_1915-druckerwarteschlange-auslesen.h ...) und lese jetzt zum einen die Warteschlange aus und warte an der Stelle der Messagebox noch 20 Sekunden (ich weiß nicht warum das vorher mit nur warten nicht funktioniert hat ... vielleicht hab ich da nen falschen Befehl benutzt) sobald mindestens 20 Sekunden vergangen sind und die Warteschlange leer ist gehe ich zum nächsten Drucker bzw zum Archiv. Bin gerade noch auf einen kleinen Schönheitsfehler gestoßen, und zwar würde ich gerne sofort zum nächsten Drucker gehen sobald etwas mit dem gerade gewählten Drucker gedruckt wurde. Mein derzeitiger Ansatz funktioniert aber leider nicht. Das Programm wartet die komplette Wartezeit und geht erst dann zum nächsten Drucker/Archiv auch wenn in der Zwischenzeit etwas gedruckt wurde.

Alle Checkboxen bis auf die Archiv-Checkbox enthalten Drucker. Die Zeilen 20 - 31 enthalten die Schleife, die bis zum nächsten Druck durchlaufen werden soll.

01.
For Each Ctrl In Me.Controls 
02.
            If TypeOf Ctrl Is CheckBox Then 
03.
                If Not DirectCast(Ctrl, CheckBox).Name = "chkbArchiv" Then 
04.
                    If DirectCast(Ctrl, CheckBox).Checked Then 
05.
                        Try 
06.
                            streamToPrint = New StreamReader(filePath) 
07.
                            Try 
08.
                                AddHandler PrintDocument1.PrintPage, AddressOf PrintDocument1_PrintPage 
09.
                                PrintDocument1.PrinterSettings.PrinterName = DirectCast(Ctrl, CheckBox).Text 
10.
                                Shell(String.Format("rundll32 printui.dll,PrintUIEntry /y /n ""{0}""", DirectCast(Ctrl, CheckBox).Text)) 
11.
                                AxAcroPDF1.Print() 
12.
                            Finally 
13.
                                streamToPrint.Close() 
14.
                            End Try 
15.
                        Catch ex As Exception 
16.
                            MessageBox.Show(ex.Message) 
17.
                        End Try 
18.
                        Wartezeitende = Date.Now.Hour * 3600 + Date.Now.Minute * 60 + Date.Now.Second + 20 
19.
 
20.
                        Dim Counter As Integer = 0 
21.
                        Do While True 
22.
                            If Not Warteschlangeleer(DirectCast(Ctrl, CheckBox).Text) Then 
23.
                                Counter = 1 
24.
                            End If 
25.
                            If Warteschlangeleer(DirectCast(Ctrl, CheckBox).Text) And Counter = 1 Then 
26.
                                Counter = 2 
27.
                            End If 
28.
                            If (Warteschlangeleer(DirectCast(Ctrl, CheckBox).Text) And Date.Now.Hour * 3600 + Date.Now.Minute * 60 + Date.Now.Second > Wartezeitende) Or (Counter = 2) Then 
29.
                                Exit Do 
30.
                            End If 
31.
                        Loop 
32.
                    End If 
33.
                End If 
34.
            End If 
35.
        Next
Hilfsfunktionen aus dem oben geposteten Link (leicht geändert):
01.
Private Function Warteschlangeleer(Druckername As String) As Boolean 
02.
        Dim JobQuery As String = "Select * From Win32_Printjob" 
03.
        Warteschlangeleer = True 
04.
        Dim Printer As String = "" 
05.
        Dim Jobs As New ManagementObjectSearcher(JobQuery) 
06.
        For Each Job As ManagementObject In Jobs.Get() 
07.
            Printer = WMIGetInfo(Job, "DriverName") 
08.
            If Printer = Druckername Then 
09.
                Warteschlangeleer = False 
10.
            End If 
11.
        Next 
12.
    End Function
01.
    Private Function WMIGetInfo(ByVal WMIObj As ManagementObject, _ 
02.
    ByVal Key As String) As String 
03.
 
04.
        If Not WMIObj(Key) Is Nothing Then 
05.
            Return WMIObj(Key).ToString 
06.
        Else 
07.
            Return "" 
08.
        End If 
09.
    End Function
Bitte warten ..
Mitglied: Mesaou
29.01.2015 um 16:49 Uhr
OK ... gerade noch was anderes getestet. Das Problem ist, dass der Drucker nicht so heißt wie sein Treiber, ich muss also nur noch herausfinden ob die WMI auch den echten Namen übergibt.
Bitte warten ..
Mitglied: 114757
LÖSUNG 29.01.2015, aktualisiert 30.01.2015
Zitat von Mesaou:

OK ... gerade noch was anderes getestet. Das Problem ist, dass der Drucker nicht so heißt wie sein Treiber, ich muss also
nur noch herausfinden ob die WMI auch den echten Namen übergibt.
In der Eigenschaft Name des Printjobs steht der Druckername, musst du nur anhand des Kommas trennen
01.
Printer = WMIGetInfo(Job, "Name").split(",")(0)
oder für den Fall das der Druckername ein Komma enthalten sollte:
01.
Printer = WMIGetInfo(Job, "Name") 
02.
Printer = Printer.Substring(0,Printer.LastIndexOf(","))
Bitte warten ..
Mitglied: Mesaou
30.01.2015 um 08:46 Uhr
Danke für die Idee ich habs etwas anders gemacht. Hab mir erstmal alle WMI-Infos ausgeben lassen und dann gesehen dass Caption, Name und Description den selben Inhalt haben, Name wird das richtige sein da ich beim Suchen der Drucker auch nach dem Namen suche. Danach mache ich ein
01.
If(Instr(Name, Druckername)>0)
Grüße
Mesaou
Bitte warten ..
Mitglied: Mesaou
30.01.2015, aktualisiert 02.02.2015
Was wäre die Welt wenn man nicht immer noch was finden würde wo man dran rumschrauben könnte. Wie gesagt an sich funktioniert jetzt alles. Wenn man den Druckdialog aber vor Ablauf der Wartezeit abbricht, wird in diesem Moment keine der Bedingungen für das Verlassen der Schleife erfüllt (Es wurde nichts in die Warteschlange gegeben => Counter noch 0 und die Wartezeit ist noch nicht abgelaufen), damit muss man warten bis die Zeit abgelaufen ist. Ich suche gerade nach einer Möglichkeit in diesem Fall vorzeitig aus der Schleife zu gehen. Falls jemand ne Idee hat würde ich mich über eine Erleuchtung freuen.

Grüße
Mesaou

P.S.
Das Problem an dem ich hänge ist das die AxAcroPDF.Print() keinen Rückgabewert hat und diesen damit auch nicht mit prüfen kann. Meine Suche nach einem Workaround ist bisher leider erfolglos.
Bitte warten ..
Mitglied: Mesaou
03.02.2015, aktualisiert um 16:43 Uhr
Ist es möglich mit VB.Net abzufangen, wenn sich ein Fenster öffnet (hier das Druckfenster) und dann eine ID oder was ähnliches zu ermitteln um damit in der Schleife zu prüfen ob das Fenster mit der ID noch offen ist? Habe leider noch keine Umsetzung dafür gefunden.
Bitte warten ..
Mitglied: Mesaou
04.02.2015 um 16:49 Uhr
So ich hab jetzt ne Lösung, falls noch jemand auf dieses Problem stoßen sollte:

Die Abbruchbedingungen ist jetzt:
- Eine leere Warteschlange UND
- Das Acrobat-Steuerelement muss den Fokus bekommen haben UND
- Das Ablaufen einer 2-Sekunden-Wartezeit


Die erste Bedingung lässt sich über WMIGetInfo zu prüfen.
Die zweite Bedingung wird mit der AcroCheck-Variable (global, wird nur in der AxAcroPDF1_Enter gesetzt) kontrolliert.
Für die letzte Bedingung speichere ich mir die auf Sekunden heruntergebrochene Zeit in 2 Sekunden ab, sobald das Acrobat-Steuerelement den Fokus bekommt. Die Zeit wird erst hier gesetzt da der User prinzipiell zu einer beliebigen Zeit auf den Druck bzw Abbruchbutton klicken kann.
Bricht der User den Druckdialog ab sind alle bedingungen 2 Sekunden später erfüllt, da kein Dokument in die Warteschlange kommt.
Druckt der User bleibt man in der Warteschleife bis das Dokument fertig gedruckt ist (bzw falls es ein kleines Dokument ist auch mindestens 2 Sekunden)

01.
If (Warteschlangeleer(DirectCast(Ctrl, CheckBox).Text, filePath) And AcroCheck And Date.Now.Hour * 3600 + Date.Now.Minute * 60 + Date.Now.Second > Wartezeitende2 ) Then 
02.
      Exit Do 
03.
End If
01.
    Private Sub AxAcroPDF1_Enter(sender As Object, e As EventArgs) Handles AxAcroPDF1.Enter 
02.
        AcroCheck = True 
03.
        Wartezeitende2 = Date.Now.Hour * 3600 + Date.Now.Minute * 60 + Date.Now.Second + 2 
04.
    End Sub
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows 10
gelöst Adobe Reader DC macht komische Dinge (2)

Frage von Fenris14 zum Thema Windows 10 ...

Windows Netzwerk
gelöst Adobe Reader XI - Wie Updates sinnvoll verteilen? (9)

Frage von mklaes zum Thema Windows Netzwerk ...

Microsoft
Update Adobe Reader ähnlich WSUS Server (5)

Frage von sockel7 zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...