2009-04-07 4 views
5

WPF kullanıyorum ve kullanıcıların yazıcı ve yazıcı özellikleri (ör. Papertray, manzara/portre, çift yönlü, vb.) Gibi bazı yazdırma ile ilgili seçenekleri ayarlamasına izin vermeliyim. PrintQueue ve PrintTicket nesnesi almak için PrintDialog sınıfının farkındayım. Ancak, I özel çözümü oluşturmam ve PrintDialog'u gösteremem gerekiyor. Kullanılabilir PrintQueue nesnelerini alıp kullanıcıların bir yazıcı seçmesine izin veriyorum. Yazıcı özellikleriyle uğraşıyorum. Sorum şu: Bir kullanıcının seçilen PrintQueue için yazıcı özelliklerini ayarlayabileceği iletişim kutusunu nasıl gösterebilirim (bir kullanıcı WPF PrintDialog'daki Özellikler düğmesini tıklattığında gösterilen iletişim kutusu).Yazıcı seçeneklerini el ile ayarlamak için iletişim kutusunu nasıl çağırırım?

+0

bu soruya bakın: http://stackoverflow.com/questions/2437337/how-to-show-printer-properties-preferences-dialog-and -değişiklikleri Kaydet –

cevap

4

Aşağıdaki kod here (eksi Window_Loaded olay) bulunmuştur. Test ettim ve bir çekicilik gibi çalışıyor gibi görünüyor. Açıkça, iletişim kutusunu görüntülemeden önce yazıcı adını PrinterSettings nesnesine ayarlamanız gerekir. devModeData tahsis ederken, DocumentPropreties hep başarısız olur ve bir sizeNeeded ait döndürür: Eğer x86 derleme hedefleyen ve bir x64 makinesinden çalıştırırsanız

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

, Pwninstein kod çalışmaz: Bu

Umut sizin için çalışan -1, bir LastError koduyla 13.

sorunu çözmek, ya emin AnyCPU hedef ya da sadece aşağıdaki DocumentPropreties çağrısını değiştirmek yapmak için:

int sizeNeeded = DocumentProperties(pHandle, 
            IntPtr.Zero, 
            printerSettings.PrinterName, 
            IntPtr.Zero, // This solves it 
            pDevMode, 
            fMode); 

yerine DEVMODE'ın yapısına uygun bir işaretçi IntPtr.Zero yanlış görünüyor kullanarak, ama DocumentProperties o ilk çağrı o pozisyonda hafızayı değiştirmek için çalışmaz. Çağrının getirdiği tek veri, yazıcı sürücüsünün iç parametrelerini temsil eden cihaz modu verilerinin saklanması için gereken hafıza boyutudır.

Referans: