Erhaltener Druckauftrag Python

8

Ich habe es erfolgreich geschafft, einen Rückruf auszulösen, wenn ein Druckauftrag beim Spoolen auf dem lokalen Rechner angefordert wird. Aber gibt es trotzdem mit win32print oder etwas ähnliches, die mir erlauben, das Ereignis zu behandeln, in dem ein Druckauftrag auf einen Druckserver oder einen USB-Drucker übertragen wird?

%Vor%     
Malik Brahimi 29.12.2015, 21:51
quelle

1 Antwort

3

Hier ist eine Idee, die auf meinem Computer (Windows 8) funktioniert hat. Es ist kaum vollwertiger Code, aber es könnte dich in Schwung bringen. Sie müssen die Funktionen FindFirstPrinterChangeNotification und FindNextPrinterChangeNotification Diese sind in winspool.drv auf der Client-Seite enthalten (irritierend können Sie feststellen, dass sie in spoolSS.dll dokumentiert sind, aber dies ist Server-Seite - dieses Diagramm kann verdeutlichen).

Die Liste der Ereignisse, auf die gehört werden kann (und vor allem ihre Flag-Einstellungen), finden Sie unter MSDN hier . Anfangs dachte ich, du wolltest PRINTER_CHANGE_ADD_JOB ( 0x00000100 ), aber ich denke, du möchtest vielleicht PRINTER_CHANGE_WRITE_JOB ( 0x00000800 ). Dies wird nicht ausgelöst, sobald der Job mit dem Spooling beginnt. In dem Beispiel, in dem Sie ein Dokument an einen Netzwerkdrucker senden, scheint es jedoch mehrmals ausgelöst zu werden.

Leider sind diese APIs in der win32print -Bibliothek nicht verfügbar. Ich denke, deshalb musst du in ctypes eintauchen. Hier habe ich keinen Callback als solchen registriert, sondern ich höre auf die Benachrichtigung und wenn er ausgelöst wird, rufe ich die Funktion auf und höre wieder in einer Endlosschleife. Der Prozess wird während des Abhörens angehalten. Wenn Sie konventionelle Callback-Funktionalität benötigen, können Sie dieses Skript entweder in einem eigenen Thread ausführen oder diese Antwort wird nicht Ihren Anforderungen entsprechen.

Hinweis - Dies hört einfach auf den angeforderten Druckauftrag ab und ruft dann eine Funktion auf. Wenn Sie Informationen über den ausgelösten Job extrahieren möchten, wird der Code fürchterlich. Weiterer Hinweis - es wird für einen Druckauftrag ausgelöst, der gestartet und anschließend abgebrochen wird, aber ich denke, das ist in Ordnung.

%Vor%

Hinweis: Hier gibt es einige kleine Unterschiede zwischen Python 2.7 und Python 3 - z. die Initialisierung von c_char_p ctype aus einer Zeichenkette. Ich habe die einfachste Version vorgestellt, die ich hier hätte - sie funktioniert in 2.7.

Postscript

Ich habe das ganze schwere Heben getan und dann diese Antwort gefunden , das ist so etwas wie ein Duplikat. Es hat eher schöneren Code, der Unicode-Druckernamen und dergleichen behandelt, aber nur den lokalen Druckserver vor Ort.

    
J Richard Snape 07.01.2016, 11:11
quelle