簡體   English   中英

打印機屬性對話框已保存更改

[英]Printer properties Dialog Saved changes

嗨,我想保存我在打印機首選項中所做的更改,但它們被忽略了。 我在 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();         

    }
}

這應該可以解決問題,經過嘗試和測試(確保您有對 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);

對話框確定后,打印票將被更新。 您可能希望在此處返回打印票證,或使用默認票證的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM