EDIT: Meine Schuld! Ich erwartete, dass die Änderungen auf die Standarddruckereinstellungen zurückgeschrieben werden, wenn tatsächlich nur die lokale Instanz der PrinterSettings geändert wird. - Der folgende Code scheint wie vorgesehen zu funktionierenWie Druckereigenschaften/Präferenzen Dialog zeigen und Änderungen speichern?
Ich versuche, die benutzerdefinierten Druckereigenschaften eines bestimmten Druckers anzuzeigen. Ich brauche das als Teil eines benutzerdefinierten PrintDialogs, den ich versuche zu schreiben.
Die meisten der Beispiele, die ich online finden kann, verwalten den Dialog, aber alle Änderungen, die der Benutzer macht, gehen verloren, was ihn nutzlos macht.
Beispiel: http://www.codeproject.com/KB/system/PrinterPropertiesWindow.aspx
(in Bezug auf oben Seite: Ich habe versucht, den Code zu ändern, wie durch BartJoy (auf der Seite vorgeschlagen), aber das hat es nicht fix)
Ich habe auch versucht die Probe und Vorschläge auf der pinvoke.net Seite, aber es funktioniert immer noch nicht:
http://www.pinvoke.net/default.aspx/winspool.documentproperties
Aus den oben genannten Websites ich gehe davon aus, dass das Problem nur auf 64-Bit-Windows-a sein könnte nd oder wenn ein Druckername länger als 32 Zeichen ist.
Ich weiß nicht, was ich als nächstes versuchen sollte ... Ich freue mich über 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);
}
ich die Open und Closeprinter Methode zu verwenden, haben versucht, und die devModeData als Ausgabeparameter in der zweiten Aufforderung übergeben, wie ich es, dass die ursprüngliche seltsam gefunden Code aus dem pinvoke.net hat das nicht gemacht. (Aber ich gebe zu, dass ich nicht weiß, was ich tue - das ist nur Versuch und Irrtum).
Hier ist der ursprüngliche 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 den chages wieder gerettet werden verwaltet? Dieser Code ändert die printerSettings, aber die Änderungen werden nicht als die Standarddruckereinstellungen gespeichert :( – Ando