2009-06-02 11 views

Répondre

2

Pour afficher la boîte de dialogue PrinterSettings utilisation

[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

Depuis que je ne suis pas assez fiable pour modifier la réponse acceptée, je posterai une deuxième réponse à la place ...

La réponse acceptée fonctionne bien pour affichage d'une boîte de dialogue d'imprimante native et obtention des modifications à partir de cette boîte de dialogue. Cependant, il ne définit pas correctement les propriétés de la boîte de dialogue.

Afin de pousser les paramètres dans la boîte de dialogue native, vous devez modifier la signature de DocumentProperties comme suit. La nouvelle signature n'utilise pas de paramètre ref en entrée.

Here is the page qui m'a indiqué cette petite différence, mais significative.

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