Имея PrintTicket
, как отобразить диалоговое окно конфигурации принтера?Отображение диалогового окна конфигурации принтера
Примечание: Я не имею в виду PrintDialog
из пространства имен System.Windows.Controls
.
Имея PrintTicket
, как отобразить диалоговое окно конфигурации принтера?Отображение диалогового окна конфигурации принтера
Примечание: Я не имею в виду PrintDialog
из пространства имен System.Windows.Controls
.
Чтобы показать использование диалогового PrinterSettings
[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,
ref IntPtr pDevModeInput,
int fMode);
[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 void OpenPrinterPropertiesDialog(PrinterSettings printerSettings) {
var handle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
var hDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings);
var pDevMode = GlobalLock(hDevMode);
var sizeNeeded = DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, ref pDevMode, 0);
var devModeData = Marshal.AllocHGlobal(sizeNeeded);
DocumentProperties(handle, IntPtr.Zero, printerSettings.PrinterName, devModeData, ref pDevMode, 14);
GlobalUnlock(hDevMode);
printerSettings.SetHdevmode(devModeData);
printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
GlobalFree(hDevMode);
Marshal.FreeHGlobal(devModeData);
}
// Show this dialog.
var printQueue = LocalPrintServer.GetDefaultPrintQueue();
var settings = new PrinterSettings { PrinterName = printQueue.FullName };
OpenPrinterPropertiesDialog(settings);
Поскольку я не достаточно надежным, чтобы изменить принятый ответ, я выложу второй ответ вместо ...
Принятая ответ отлично работает для показывая диалоговое окно родного принтера и получая изменения в этом диалоговом окне. Тем не менее, он не устанавливает свойства в диалоговом окне правильно, заранее.
Чтобы настроить параметры в исходном диалоге, вы должны изменить подпись DocumentProperties следующим образом. Новая подпись не использует параметр ref в качестве входных данных.
Here is the page, который указал мне на эту небольшую, но значительную разницу.
[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, //removed ref
int fMode);