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 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
DEVMODE
Struktur vor der Zuweisung von it?DEVMODE
Puffer mit den Standard-Einstellungen, nachdem Sie zugewiesen haben, gibt es?DM_IN_BUFFER
undDM_OUT_BUFFER
flags (zusätzlich zuDM_IN_PROMPT
) in derfMode
parameterDocumentProperties
?pDevModeInput
undpDevModeOutput
zu denDEVMODE
Puffer-Initialisierung beim Start der Anwendung?dmFields
bits in derDEVMODE
Puffer ordnungsgemäß eingestellt ist, bevor Sie Ihre BerufungDocumentProperties(... DM_IN_PROMPT ...)
DEVMODE
Puffer zwischen anrufen zuDocumentProperties(... DM_IN_PROMPT ...)
?Finden Sie unter:
Obwohl die Antwort endete seine Arbeit in der Frage, ich denke, die folgenden bietet eine bessere Antwort auf die ursprüngliche Frage,
(1) Weil es nicht klar ändern Sie die bestanden-in PrinterSettings wenn der Benutzer abbricht.
(2) Weil es gibt ein DialogResult, die den Anrufer interessieren.
Wenn Sie Ziel-x86 Kompilierung und Ausführung von einer x64-Maschine, den code von Jeff Roe wird nicht funktionieren: bei der Zuteilung von
devModeData
,DocumentPropreties
schlägt immer fehl und gibt einensizeNeeded
-1, mit einemLastError
code 13.Das problem zu lösen, entweder stellen Sie sicher, dass Sie Ziel AnyCPU oder einfach nur ändern Sie den Aufruf
DocumentPropreties
um die folgenden:Mit
IntPtr.Zero
statt einer richtigen Zeiger auf eine DevMode-Struktur sieht falsch aus, aber der erste Aufruf von DocumentProperties nicht zu ändern versuchen die Erinnerung an diese position. Es werden nur Daten zurückgegeben, durch den Aufruf der Speicher-Größe benötigt, um das Gerät-Modus-Daten, die für die internen Parameter des Druckertreibers.Referenz:
Auch, wenn Sie wollen, dies zu tun mit WPF-Klassen (PrintQueue, PrintTicket) dieser Seite-Punkte, die Sie in die richtige Richtung:
http://social.msdn.microsoft.com/Forums/en/wpf/thread/0dc695c1-578d-4da5-8f68-b2a257846c02