Duplexmodus des Druckers auslesen
Hallo Gemeinde,
ich suche einen Weg, um den genauen Duplexmodus des Druckers auszulesen. Den Artikel von MS funktioniert leider nur bedingt.
Wir nutzen den API Call:
Private Declare Function SetPrinter Lib "winspool.drv" Alias _
"SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
pPrinter As Byte, ByVal Command As Long) As Long
um den entsprechenden Modus zu setzen. (Bis Windows XP)
Da wir aber jetzt auf Windows 7 64Bit migrieren wollen, funktioniert dieser API Call nicht mehr sauber und setzt den Duplexmodus
bei 1 von 10 Dokumenten falsch.
Deswegen habe ich versucht das ganze über einen virtuellen Drucker zu machen, der eine Duplexeinheit besitzt. Ich habe mir hier
lokal 3 Dateien angelegt (simplex, duplexShortSide, duplexLongSide), die ich während der Laufzeit per RunDll32 laufen lasse und
dann dementsprechend den Modus ändere. Das funktioniert soweit. Nur wenn man mehrere Dokumente mit einmal ausdruckt und
während der Laufzeit den Modus ändert, habe ich das Gefühl, das unser Word das so schnell nicht mitbekommt, dass sich der Modus
des Druckers geändert hat.
Nun meine Frage:
Gibt es einen Weg (über WMI) außer bei W32_Printer die Eigenschaft "duplex", den ich nutzen kann, um beim aktiven Drucker den aktuellen
Duplexmodus herauszufinden. Also wie gesagt, die API Calls unter Win7 laufen nicht 100%.
Danke vorab für eure Antworten.
ich suche einen Weg, um den genauen Duplexmodus des Druckers auszulesen. Den Artikel von MS funktioniert leider nur bedingt.
Wir nutzen den API Call:
Private Declare Function SetPrinter Lib "winspool.drv" Alias _
"SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _
pPrinter As Byte, ByVal Command As Long) As Long
um den entsprechenden Modus zu setzen. (Bis Windows XP)
Da wir aber jetzt auf Windows 7 64Bit migrieren wollen, funktioniert dieser API Call nicht mehr sauber und setzt den Duplexmodus
bei 1 von 10 Dokumenten falsch.
Deswegen habe ich versucht das ganze über einen virtuellen Drucker zu machen, der eine Duplexeinheit besitzt. Ich habe mir hier
lokal 3 Dateien angelegt (simplex, duplexShortSide, duplexLongSide), die ich während der Laufzeit per RunDll32 laufen lasse und
dann dementsprechend den Modus ändere. Das funktioniert soweit. Nur wenn man mehrere Dokumente mit einmal ausdruckt und
während der Laufzeit den Modus ändert, habe ich das Gefühl, das unser Word das so schnell nicht mitbekommt, dass sich der Modus
des Druckers geändert hat.
Nun meine Frage:
Gibt es einen Weg (über WMI) außer bei W32_Printer die Eigenschaft "duplex", den ich nutzen kann, um beim aktiven Drucker den aktuellen
Duplexmodus herauszufinden. Also wie gesagt, die API Calls unter Win7 laufen nicht 100%.
Danke vorab für eure Antworten.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 170236
Url: https://administrator.de/contentid/170236
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo Eraser,
mit der SetPrinter-Api hat das keinen Erfolg.
Stattdessen muß die Documentproperties-Api verwendet werden. Das ist zwar aufwendiger, geht dafür aber zu 100%
Dazu
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
4. mit ClosePrinter das Druckerhandle schliessen
Soll der Duplexstatus geändert werden:
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. den ermittelten Devmode in eine leere Devmodestructure kopieren (also nur den öffentlichen Devmode-Bereich erfassen)
4. darin den gewünschten Duplexmode in dmDuplex setzen
5. in dmFlags das Bit DM_Duplex setzen
6. den Devmode zurückkopieren
7. Documentproperties mit DM_INBUFFER OR DM_OUTBUFFER aufrufen
8. ggfs. ResetDC aufrufen
9. mit ClosePrinter das Druckerhandle schliessen
Hoffe das hilft Dir weiter
Gruß Softprogger
3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
mit der SetPrinter-Api hat das keinen Erfolg.
Stattdessen muß die Documentproperties-Api verwendet werden. Das ist zwar aufwendiger, geht dafür aber zu 100%
Dazu
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
4. mit ClosePrinter das Druckerhandle schliessen
Soll der Duplexstatus geändert werden:
1. mit OpenPrinter ein Handle auf den Drucker besorgen
2. mit Documentproperties den Devmode holen
3. den ermittelten Devmode in eine leere Devmodestructure kopieren (also nur den öffentlichen Devmode-Bereich erfassen)
4. darin den gewünschten Duplexmode in dmDuplex setzen
5. in dmFlags das Bit DM_Duplex setzen
6. den Devmode zurückkopieren
7. Documentproperties mit DM_INBUFFER OR DM_OUTBUFFER aufrufen
8. ggfs. ResetDC aufrufen
9. mit ClosePrinter das Druckerhandle schliessen
Hoffe das hilft Dir weiter
Gruß Softprogger
3. aus der Devmode-Structure dmDuplex lesen ---> momentaner Duplexmodus
Hi Eraser,
ich kann zwar keinen API-Code sehen, aber ich denke es fehlt das Resetten des PrinterDC's.
also nach dem Setzen der Dokumentproperties noch ResetDC(Handle,pDevmode), sonst verbleibt der Drucker auf seinem vohergehenden Status.
(In VB ist das Printerhandle fast immer offen!)
Diese Problematik betrifft nicht nur Windows7 (wobei es da hauptsächlich Pointerprobleme gibt...).
Früher habe ich auch mal solche Experimente unter VB6 gemacht. Dadurch bin ich mehr und mehr zu dem Stand gekommen, dass VB6 für das GUI einer App ganz interessant ist, aber wenn es ans 'Eingemachte' geht, sollte schon wegen der Performance mit den API's jongliert werden, und das nach Möglichkeit in einer eigenstämdigem DLL.
VB-Net hat sicherlich mehr Möglichkeiten, verliert aber noch mehr Performance, da über das Framework letztendlich auch nur API's über einen Wrapper zum Tragen kommen. So wird der Zuwachs an Hardwarepower oft schneller verheizt als man denkt.
Als Programmierer, der mit DOS und seinen beschränkten (Hardware-)Möglichkeiten groß geworden ist, tut es manchmal einfach weh, wie unachtsam mit Resourcen umgegangen wird.
Gruß
Softprogger
ich kann zwar keinen API-Code sehen, aber ich denke es fehlt das Resetten des PrinterDC's.
also nach dem Setzen der Dokumentproperties noch ResetDC(Handle,pDevmode), sonst verbleibt der Drucker auf seinem vohergehenden Status.
(In VB ist das Printerhandle fast immer offen!)
Diese Problematik betrifft nicht nur Windows7 (wobei es da hauptsächlich Pointerprobleme gibt...).
Früher habe ich auch mal solche Experimente unter VB6 gemacht. Dadurch bin ich mehr und mehr zu dem Stand gekommen, dass VB6 für das GUI einer App ganz interessant ist, aber wenn es ans 'Eingemachte' geht, sollte schon wegen der Performance mit den API's jongliert werden, und das nach Möglichkeit in einer eigenstämdigem DLL.
VB-Net hat sicherlich mehr Möglichkeiten, verliert aber noch mehr Performance, da über das Framework letztendlich auch nur API's über einen Wrapper zum Tragen kommen. So wird der Zuwachs an Hardwarepower oft schneller verheizt als man denkt.
Als Programmierer, der mit DOS und seinen beschränkten (Hardware-)Möglichkeiten groß geworden ist, tut es manchmal einfach weh, wie unachtsam mit Resourcen umgegangen wird.
Gruß
Softprogger