2011-12-27 3 views
3

Привет, я хочу сохранить изменения, внесенные в настройки принтера, но они игнорируются. Я делаю это в C# Пожалуйста, помогите мне спасибоСвойства принтера Диалог Сохраненные изменения

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    PrintDocument pd = new PrintDocument(); 

    [DllImport("kernel32.dll")] 
    static extern IntPtr GlobalLock(IntPtr hMem); 

    [DllImport("kernel32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] static extern bool GlobalUnlock(IntPtr hMem); 

    [DllImport("kernel32.dll")] 
    static extern IntPtr 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 int DM_IN_BUFFER = 8; 
    private const int DM_OUT_BUFFER = 2; 
    private const int DM_IN_PROMPT = 4; 

    private void ShowPrinterProperties(PrinterSettings settings) 
    { 
     IntPtr hDevMode = settings.GetHdevmode(settings.DefaultPageSettings); 

     IntPtr pDevMode = GlobalLock(hDevMode); 

     DocumentProperties(this.Handle, IntPtr.Zero, settings.PrinterName, pDevMode, pDevMode, DM_IN_PROMPT); 

     GlobalUnlock(hDevMode); 

     settings.SetHdevmode(hDevMode); 

     settings.DefaultPageSettings.SetHdevmode(hDevMode); 

     GlobalFree(hDevMode); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
      // Add list of installed printers found to the combo box. 
      // The pkInstalledPrinters string will be used to provide the display string. 
      String pkInstalledPrinters; 
      for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++) 
      { 
       pkInstalledPrinters = PrinterSettings.InstalledPrinters[i]; 
       comboBox1.Items.Add(pkInstalledPrinters); 
       //selectedPrinter = comboBox1.SelectedItem.ToString(); 
      } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
      if (pd.PrinterSettings.IsValid) 
       ShowPrinterProperties(pd.PrinterSettings); 
      else 
       MessageBox.Show("Invalid printer name"); 
    } 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 

     pd.PrinterSettings.PrinterName = comboBox1.Text; 
     // selectedPrinter = comboBox1.SelectedItem.ToString();   

    } 
} 
+0

Вы можете показать нам свой код, пожалуйста? – Shai

+0

взгляните на http://stackoverflow.com/questions/4734245/how-to-save-print-settings-from-a-windows-forms-program –

+0

показывает все установленные принтеры, но если я изменю любые настройки, не сохранит их – abdul

ответ

2

Это должно сделать трюк, испытанный (убедитесь, что у вас есть ссылки на System.Drawing, System.Printing и ReachFramework сборки):

public static bool GetPrinterProperties(PrinterDescription selectedPrinter, bool showPrintingPreferencesDialog) 
    { 
     int modeGetSizeOfBuffer = 0; 
     int modeCopy = 2; 
     int modeOutBuffer = 14; 

     IntPtr pointerHDevMode = new IntPtr(); 
     IntPtr pointerDevModeData = new IntPtr(); 

     try 
     { 
      PrintTicketConverter printTicketConverter = new PrintTicketConverter(selectedPrinter.FullName, selectedPrinter.ClientPrintSchemaVersion); 
      IntPtr mainWindowPtr = new WindowInteropHelper(Application.Current.MainWindow).Handle; 
      PrinterSettings printerSettings = new PrinterSettings(); 

      pointerHDevMode = printerSettings.GetHdevmode(printerSettings.DefaultPageSettings); 
      IntPtr pointerDevMode = GlobalLock(pointerHDevMode); 

      int sizeNeeded = DocumentProperties(mainWindowPtr, IntPtr.Zero, selectedPrinter.FullName, IntPtr.Zero, pointerDevMode, modeGetSizeOfBuffer); 
      pointerDevModeData = Marshal.AllocHGlobal(sizeNeeded); 

      int result = -1; 

      if (!showPrintingPreferencesDialog) 
      { 
       result = DocumentProperties(mainWindowPtr, IntPtr.Zero, selectedPrinter.FullName, pointerDevModeData, pointerDevMode, modeCopy); 
      } 
      else 
      { 
       result = DocumentProperties(mainWindowPtr, IntPtr.Zero, selectedPrinter.FullName, pointerDevModeData, pointerDevMode, modeOutBuffer); 
      } 

      GlobalUnlock(pointerHDevMode); 

      if (result == 1) 
      { 
       byte[] devMode = new byte[sizeNeeded]; 
       Marshal.Copy(pointerDevModeData, devMode, 0, sizeNeeded); 

       // set back new printing settings to selected printer. 
       selectedPrinter.DefaultPrintTicket = printTicketConverter.ConvertDevModeToPrintTicket(devMode); 

       return true; 
      } 
     } 
     finally 
     { 
      GlobalFree(pointerHDevMode); 
      Marshal.FreeHGlobal(pointerDevModeData); 
     } 

     return false; 
    } 

PrinterDescription класс выглядит следующим образом:

public class PrinterDescription 
    { 
     public string FullName { get; set; } 
     public int ClientPrintSchemaVersion { get; set; } 
     public PrintTicket DefaultPrintTicket { get; set; } 
    } 

И используется следующий импорт:

[DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesW", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] 
    private static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode); 

    [DllImport("kernel32.dll")] 
    private static extern IntPtr GlobalLock(IntPtr hMem); 

    [DllImport("kernel32.dll")] 
    private static extern bool GlobalUnlock(IntPtr hMem); 

    [DllImport("kernel32.dll")] 
    private static extern bool GlobalFree(IntPtr hMem); 

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

Смежные вопросы