2009-06-02 1 views

ответ

2

Чтобы показать использование диалогового 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); 
3

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

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

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