Отображение диалогового окна конфигурации принтера - PullRequest
1 голос
/ 02 июня 2009

Имея PrintTicket, как отобразить диалоговое окно конфигурации конкретного принтера?

Примечание: я не имею в виду PrintDialog из пространства имен System.Windows.Controls.

Ответы [ 2 ]

3 голосов
/ 25 марта 2011

Поскольку я не достаточно надежен, чтобы редактировать принятый ответ, я выложу второй ответ ...

Принятый ответ отлично работает для отображения диалогового окна собственного принтера и получения изменений из этого диалога. Однако он не устанавливает свойства в диалоговом окне заранее.

Чтобы вставить настройки в собственное диалоговое окно, необходимо изменить подпись DocumentProperties следующим образом. Новая подпись не использует параметр ref в качестве входных данных.

Вот страница , которая указала мне на эту небольшую, но существенную разницу.

[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 голосов
/ 01 июля 2009

Чтобы отобразить диалоговое окно 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...