如何调用对话框手动设置打印机选项?

Fro*_*ain 5 printing wpf printer-properties

我正在使用WPF,需要让用户设置一些打印相关选项,如打印机和打印机属性(例如papertray,横向/纵向,双面打印等).我知道PrintDialog类可以获取PrintQueue和PrintTicket对象.但是,我需要创建自定义解决方案,无法显示PrintDialog.我设法获得可用的PrintQueue对象,并让用户选择一台打印机.我正在努力打印机属性.我的问题是:如何显示用户可以为所选PrintQueue设置打印机属性的对话框(当用户单击WPF PrintDialog中的"属性"按钮时显示的对话框).

Mar*_*ter 5

这里找到以下代码(减去Window_Loaded事件)。我测试了它,它似乎很有魅力。显然,您必须PrinterSettings在显示对话框之前在对象中设置打印机名称。

希望这对你有用:

[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);

[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);

private const Int32 DM_OUT_BUFFER = 14;

public void OpenPrinterPropertiesDialog(PrinterSettings printerSettings, System.IntPtr pHandle) {
    IntPtr hDevMode = printerSettings.GetHdevmode();
    IntPtr pDevMode = GlobalLock(hDevMode);
    Int32 fMode = 0;
    int sizeNeeded = DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, pDevMode, pDevMode, fMode);
    IntPtr devModeData = Marshal.AllocHGlobal(sizeNeeded);

    fMode = DM_OUT_BUFFER;

    DocumentProperties(pHandle, IntPtr.Zero, printerSettings.PrinterName, devModeData, pDevMode, fMode);
    GlobalUnlock(hDevMode);
    printerSettings.SetHdevmode(devModeData);
    printerSettings.DefaultPageSettings.SetHdevmode(devModeData);
    GlobalFree(hDevMode);
    Marshal.FreeHGlobal(devModeData);
}

private void Window_Loaded(object sender, RoutedEventArgs e) {
    OpenPrinterPropertiesDialog(new PrinterSettings(), new WindowInteropHelper(this).Handle);
}
Run Code Online (Sandbox Code Playgroud)