代码之家  ›  专栏  ›  技术社区  ›  Michael Damatov

显示打印机特定配置对话框

  •  1
  • Michael Damatov  · 技术社区  · 15 年前

    PrintTicket 如何显示打印机特定配置对话框?

    注:我不是指 PrintDialog System.Windows.Controls 命名空间。

    2 回复  |  直到 15 年前
        1
  •  3
  •   SomeCodeMonkey    14 年前

    由于我不够可信,无法编辑已接受的答案,因此我将发布第二个答案。。。

    接受的答案可以很好地显示本机打印机对话框并从该对话框中获取更改。但是,它没有事先正确设置对话框的属性。

    为了将设置推送到本机对话框中,必须按如下所示更改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);
    
        2
  •  2
  •   Alexander Zwitbaum    15 年前

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