Wie um zu zeigen, Drucker Eigenschaften/Einstellungen-dialog und speichern Sie die änderungen?

EDIT: Mein Fehler! Ich erwartet, dass die änderungen geschrieben werden, wieder auf die Standard-Drucker-Einstellungen, wenn in der Tat nur die lokale Instanz des PrinterSettings-geändert werden. - Den code unten scheint zu funktionieren wie gedacht

Ich versuche zu zeigen, die Drucker Eigenschaften eines bestimmten Druckers. Ich brauche diese als Teil einer benutzerdefinierten PrintDialog, die ich bin versucht zu schreiben.

Den meisten Beispielen, die ich online finden kann, zu verwalten, um das Dialogfeld aber alle änderungen, die der Benutzer machen kann, sind verloren, was ihn nutzlos macht.

Beispiel:
http://www.codeproject.com/KB/system/PrinterPropertiesWindow.aspx

(in Bezug auf oben Seite: ich habe versucht, ändern Sie den code wie vorgeschlagen von BartJoy (auf der Seite), aber das hat nicht fix it)

Ich habe auch versucht, die Probe und Anregungen für die pinvoke.net Seite, aber es funktioniert immer noch nicht:

http://www.pinvoke.net/default.aspx/winspool.documentproperties

Aus den oben genannten Webseiten ich gehe davon aus, dass das problem möglicherweise nur auf 64-bit-Windows und/oder wenn ein Druckername mehr als 32 Zeichen.

Ich weiß nicht, was soll ich als Nächstes versuchen... ich Schätze alle Vorschläge und Kommentare!

EDIT: Hier ist was ich versucht habe:

[DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true,
 ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter,
        [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName,
        IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);

[DllImport("winspool.drv")]
private static extern int OpenPrinter(string pPrinterName, out IntPtr hPrinter, IntPtr pDefault);
[DllImport("winspool.drv")]
private static extern int ClosePrinter(IntPtr phPrinter);

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

private const int DM_PROMPT = 4;
private const int DM_OUT_BUFFER = 2;
private const int DM_IN_BUFFER = 8;

private void OpenPrinterPropertiesDialog()
{
    var printerSettings = new System.Drawing.Printing.PrinterSettings();
    var printerName = printerSettings.PrinterName;

    IntPtr handle;
    OpenPrinter(printerName, out handle, IntPtr.Zero);

    IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
    IntPtr pDevMode = GlobalLock(hDevMode);
    int sizeNeeded = DocumentProperties(this.Handle, handle, printerName, pDevMode, pDevMode, 0);
    IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
    DocumentProperties(this.Handle, handle, printerName, devModeData, pDevMode, DM_IN_BUFFER | DM_PROMPT | DM_OUT_BUFFER);

    ClosePrinter(handle);
    GlobalUnlock(hDevMode);

    printerSettings.SetHdevmode(devModeData);
    printerSettings.DefaultPageSettings.SetHdevmode(devModeData);

    GlobalFree(hDevMode);
    Marshal.FreeHGlobal(devModeData);
}

Habe ich versucht, die OpenPrinter-und ClosePrinter-Methode, und übergeben Sie die devModeData als dem output-parameter in der zweiten nennen, wie ich fand es seltsam, dass der original-code aus der pinvoke.net das nicht tun. (aber ich gebe zu, dass ich nicht weiß, was ich Tue - das ist einfach trial and error).

Hier ist der original-code aus der pinvoke-Website:

private void OpenPrinterPropertiesDialog(PrinterSettings printerSettings)
{
    IntPtr hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
    IntPtr pDevMode = GlobalLock(hDevMode);
    int sizeNeeded = DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, 0);
    IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);
    DocumentProperties(this.Handle, IntPtr.Zero, printerSettings.PrinterName, IntPtr.Zero, pDevMode, 14);
    GlobalUnlock(hDevMode);
    printerSettings.SetHdevmode(devModeData);
    printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
    GlobalFree(hDevMode);
    Marshal.FreeHGlobal(devModeData);
}
  • Und wie haben Sie es geschafft, die änderungen, die hier gespeichert? Dieser code ändert die printerSettings-aber die änderungen werden nicht gespeichert, als die Standard-Drucker-Einstellungen 🙁
Schreibe einen Kommentar