2012-04-04 18 views
2

PrintSettingsDuplex Wert möglicherweise (und wird wahrscheinlich) auf Duplex.Default festgelegt werden.Suchen Sie die Standard-Duplexoption eines Druckers

Wie kann ich herausfinden, ob das bedeutet, dass der gewählte Drucker nicht im Duplexdruck drucken wird oder nicht?

Wie kann ich die Standardwerte für das unterstützte Verhalten eines installierten Druckers finden?

+0

Ich versuche mir vorzustellen, warum es wichtig wäre, und versagt. –

+1

@Damien_The_Unbeliever - Wir versuchen, eine Reihe von Dokumenten in einem einzigen Dokument zum Drucken in einem einzigen Druckauftrag zusammenzuführen. Wir müssen jedoch die Duplex-Optionen berücksichtigen, die bei diesem Druckauftrag auftreten, damit die Dokumente entsprechend getrennt werden können, sodass jedes Dokument auf einer neuen Seite (nicht auf der Rückseite eines anderen Dokuments) beginnt. – Reddog

+0

Können Sie nicht sicherstellen, dass jedes Dokument durch 2 teilbar ist? Wenn die ungeraden Seitenzahlen eine leere Seite hinzufügen. Dann wird es niemals auf der Rückseite einer anderen Dokumentseite gedruckt. –

Antwort

3

Ich bin nicht sicher, dass Sie können erhalten die Standardeinstellung für einen bestimmten Drucker zu studieren. Sie können jedoch die tatsächlichen aktuellen Werte abrufen, wenn Sie kreativ sind. Sie müssen sich jedoch die DEVMODE-Struktur ansehen, wenn Sie sicherstellen möchten, dass Sie über die richtigen Informationen verfügen. Dies ist keine einfache Operation und wird einige ausgefallene Win32 Fu erfordern. Dies ist aus ein paar Quellen angepasst, aber arbeitete an meinen (zugegebenermaßen fleckigen) Tests.

[DllImport("kernel32.dll")] 
static extern bool GlobalFree(IntPtr hMem); 

[DllImport("kernel32.dll")] 
public static extern IntPtr GlobalLock(IntPtr handle); 

[DllImport("kernel32.dll")] 
public static extern IntPtr GlobalUnlock(IntPtr handle); 

private static short IsPrinterDuplex(string PrinterName) 
{ 
    IntPtr hDevMode;      // handle to the DEVMODE 
    IntPtr pDevMode;      // pointer to the DEVMODE 
    DEVMODE devMode;      // the actual DEVMODE structure 

    PrintDocument pd = new PrintDocument(); 
    StandardPrintController controller = new StandardPrintController(); 
    pd.PrintController = controller; 

    pd.PrinterSettings.PrinterName = PrinterName; 

    // Get a handle to a DEVMODE for the default printer settings 
    hDevMode = pd.PrinterSettings.GetHdevmode(); 

    // Obtain a lock on the handle and get an actual pointer so Windows won't 
    // move it around while we're futzing with it 
    pDevMode = GlobalLock(hDevMode); 

    // Marshal the memory at that pointer into our P/Invoke version of DEVMODE 
    devMode = (DEVMODE)Marshal.PtrToStructure(pDevMode, typeof(DEVMODE)); 

    short duplex = devMode.dmDuplex; 

    // Unlock the handle, we're done futzing around with memory 
    GlobalUnlock(hDevMode); 

    // And to boot, we don't need that DEVMODE anymore, either 
    GlobalFree(hDevMode); 

    return duplex; 
} 

Ich benutzte die DEVMODE structure Definition von pinvoke.net. Beachten Sie, dass der Zeichensatz, der auf pinvoke.net definiert ist, möglicherweise nach den Kommentaren zu original link von B0bi optimiert werden muss (nämlich, CharSet = CharSet.Unicode in StructLayoutAttriute auf DEVMODE zu setzen). Sie benötigen auch die DM enum. Und vergessen Sie nicht, System.Runtime.InteropServices hinzuzufügen;

Sie sollten in der Lage sein, von hier aus einzuschätzen, welche Variationen Sie in Ihrer Druckereinrichtung erhalten.

1

Kurze Antwort? Du nicht. Unabhängig davon, was die verschiedenen Einstellungen sagen, kann der tatsächliche Drucker so eingestellt sein, dass er die Druckaufträge immer duplexiert.

Ich bin mir nicht ganz sicher, wie Sie die Dokumente zusammenführen wollen, aber es scheint, als könnten Sie einfach Seiten zählen und optional eine leere Seite zwischen Dokumenten einfügen, um sicherzustellen, dass jedes neue Dokument auf einer ungeraden Seite beginnt .

Es ist eine viel größere Änderung, aber wenn Sie bereit sind, zu einem XPS-Workflow zu wechseln, gibt es einen Ticketeintrag auf Seitenebene namens PageForceFrontSide, der garantiert, dass Dokumente nicht versehentlich zusammenkleben.