Steuern oder Zugriff auf benutzerdefinierte Druckereinstellungen (um 180 Grad drehen) für Drucker in C #

8

Ich habe mehrere Drucker, die das Kontrollkästchen "180 Grad drehen" enthalten:

Hier ist noch eins ("Nee" bedeutet "nein"):

Gibt es eine Möglichkeit, diesen Wert programmgesteuert festzulegen und PrintTicket zu ändern? Wenn nicht, wie kann ich den aktuellen Wert davon erhalten? Für meine Software muss ich wissen, ob das gesetzt ist oder nicht und wenn es eingestellt ist, muss es wenn möglich geändert werden. Für meine Software wäre es das Beste, wenn ich den Druckdialog nicht öffnen muss, es ist eine Software, wo Benutzer direkt drucken können, ohne auf irgendwelche Knöpfe zu klicken, also bin ich auf der Suche nach Einstellung oder programmgesteuertem Programm.

Ich habe mit ManagementObjectSearcher und in der normalen Eigenschaft PrintDocument.DefaultPageSettings gesucht, konnte aber nichts finden!

Wenn diese Option nicht eingestellt ist, möchte ich sie automatisch für die Benutzer einstellen (andernfalls wird sie mit meinen speziellen Druckern auf den Kopf gestellt). Ich habe versucht, es für die Benutzer einzustellen, aber ich kann nicht herausfinden, wie es funktioniert. Ich habe das DEVMODE struct betrachtet und versucht, es zu implementieren, aber es hat auch keine "180 Grad drehen Option" oder ähnliches.

HINWEIS: ICH VERSUCHE NICHT, den LANDSCHAFTSMODUS EINZUSTELLEN. Das ist ziemlich einfach und etwas anderes.

Ich habe Folgendes versucht:                    pdialog.PrintQueue.CurrentJobSettings.CurrentPrintTicket.PageOrientation = PageOrientation.ReversePortrait;

Dies kehrt jedoch nur die Seitenausrichtung und nicht den Inhalt um (der Inhalt muss ebenfalls gedreht werden).

Wenn ich das visuelle Bild, das ich drucke, rotiere, sind die Ränder nicht mehr richtig, das funktioniert auch nicht! Hoffe jemand kann helfen.

Vielen Dank im Voraus.

BEARBEITEN

Ich habe die Methode von Hans benutzt, um herauszufinden, welchen Wert man ändern soll. Beachten Sie, dass seine Methode für jede Art von Drucker gelten würde! Der devmode ändert den Wert von PrintDialog . Das hat mich Stunden und Stunden gekostet, um zu lösen, für wen auch immer ich helfen kann, hier ist mein Code und ich bin froh, zu teilen oder zu helfen! Zuerst versuchte ich, DefaultPrintTicket von einem new PrintServer() zu ändern, was nicht funktionierte, aber UserPrintTicket schien der richtige zu sein, wo du die Wertänderung in Windows sehen kannst.% Co_de% magic 'Wert war bereits anders. Dies war eher Praxis als die reale Nutzung.

%Vor%

...

%Vor%

Der Wert im printdialog ändert sich, aber es wird weiterhin falsch gedruckt. Die Änderungen gelten nicht. Jede Hilfe ist willkommen!

    
Markinson 08.12.2016, 11:26
quelle

3 Antworten

7

Es hilft wahrscheinlich zu erkennen, wie ungewöhnlich diese Eigenschaft ist. Lustige wahre Geschichte als Einleitung über Pete Conrad, ein Astronaut, der von der NASA für das Gemini Space Programm rekrutiert wurde. Da sie keine Ahnung davon haben, wie sich der Weltraumflug auf den Menschen auswirkt, haben die Ärzte sie mit allem konfrontiert, was ihnen einfällt. Oft sehr aufdringliche und unangenehme Tests. Conrad rebellierte und scheiterte an einem psychologischen Test. Der Arzt reichte ihm eine leere Karte und fragte: "Was siehst du?" Er schob es sofort zurück und bemerkte: "Es steht auf dem Kopf".

Dieser Drucker ist ungewöhnlich, immer etwas, worüber man sich Sorgen machen muss. Vielleicht entwickelt, um in einer Produktionslinie zu arbeiten, die eine Art von automatisiertem Papierbindevorgang beinhaltet. Druckertreiber können willkürlich Eigenschaften hinzufügen, um ihr Verhalten anzupassen, dies ist eine solche Eigenschaft. Das von Ihnen betrachtete Eigenschaftsfenster entspricht ebenfalls nicht dem Standard, es stammt aus dem Druckertreiber.

Um zu verstehen, wie Sie diese Einstellung ändern können, müssen Sie zuerst verstehen die DEVMODE-Struktur . Über die hässlichste Struktur im Winapi. Es handelt sich um eine Struktur mit variabler Größe. Die auf der MSDN-Seite angezeigte Deklaration deckt nur die Standardeigenschaften ab. Ein Druckertreiber kann sie beliebig erweitern, das Feld dmDriverExtra verfolgt, wie viele zusätzliche Bytes hinzugefügt wurden. Das Feld dmSize gibt die Größe des nicht variablen Teils der Struktur an, es ist 220 unter Windows Version 6 (Vista und höher). Etwas, das du überprüfen musst.

Winforms macht den DEVMODE direkt mit der PrinterSettings.GetHdevmode () -Methode verfügbar. WPF abstrahiert es durch die PrintTicket-Klasse. Sie müssen die PrintTicketConverter-Klasse verwenden von einem PrintTicket in einen DEVMODE und zurück konvertieren.

Was Sie zum Reverse-Engineering benötigen, ist das genaue Feld in den privaten Treiberdaten, in dem diese Einstellung gespeichert ist. Nur der Druckerhersteller kennt dieses Detail, sie werden Ihren Anruf nicht annehmen. Ein Beispielcode, der Ihnen hilft, dieses Feld zu finden und zu überprüfen, probieren Sie es einfach in einer WF-Anwendung, die nichts tut, im MainWindow-Konstruktor aus:

%Vor%

Beachten Sie, dass Sie möglicherweise viele Bytes ändern sehen. Am wahrscheinlichsten ist, dass Sie nach einem suchen würden, der von 0 auf 1 wechselt. Der Debug & gt; Windows & gt; Speicher & gt; Das Memory1-Fenster kann nützlich sein, um von Strings erzeugtes Rauschen herauszufiltern, setzen Sie "devmode2" in das Adressfeld.

Das erwartete Ergebnis ist, dass Sie jetzt wissen, wie Sie das PrintTicket anpassen können. Beachten Sie, dass es für diesen Drucker sehr spezifisch ist und sich mit einem Treiberupdate ändern kann. Sie sollten also überlegen, dies auf die logischste Art und Weise zu tun, indem Sie das zu druckende Bild mit der LayoutTransform-Eigenschaft drehen.

    
Hans Passant 11.01.2017, 12:18
quelle
1

versuch dies. "LandscapeAngle" gibt die in der Druckdialogsteuerung festgelegte Ausrichtung zurück.

%Vor%

Ref: Ссылка

    
Vidura Silva 08.12.2016 12:11
quelle
-1

Haben Sie die Print Spooler-API ausprobiert?

Ссылка

Pinvoke.net zeigt die C # -Syntax zum Aufruf von einer DLL in C #.

Ein Beispiel zum Öffnen eines Dialogs in C #:

Ссылка

    
Wayne 08.12.2016 11:54
quelle

Tags und Links