using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;

namespace PrinterLib
{
    public class PrinterHelper
    {
        #region API声明

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        internal struct structPrinterDefaults
        {
            [MarshalAs(UnmanagedType.LPTStr)]
            public String pDatatype;
            public IntPtr pDevMode;
            [MarshalAs(UnmanagedType.I4)]
            public int DesiredAccess;
        };
        const int DM_IN_BUFFER = 8;
        const int DM_OUT_BUFFER = 2;
        const int DM_IN_PROMPT = 4;
        [DllImport("winspool.Drv", EntryPoint = "OpenPrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall),
                    SuppressUnmanagedCodeSecurityAttribute()]
        internal static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPTStr)] string printerName, out IntPtr phPrinter, ref structPrinterDefaults pd);

        [DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurityAttribute()]
        internal static extern bool ClosePrinter(IntPtr phPrinter);
        [DllImport("winspool.drv")]
        public static extern int PrinterProperties(
            IntPtr hwnd,  // handle to parent window
            IntPtr hPrinter); // handle to printer object
        [DllImport("winspool.Drv", EntryPoint = "DocumentPropertiesA", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        internal static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode);
        #endregion
        /// <summary>
        /// 打印机属性
        /// </summary>
        /// <param name="printerName"></param>
        /// <param name="win"></param>
        public static void OpenPrinter(string printerName, Window win)
        {
            const int PRINTER_ACCESS_USE = 0x00000008;
            const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
            structPrinterDefaults defaults = new structPrinterDefaults();
            defaults.pDatatype = null;
            defaults.pDevMode = IntPtr.Zero;
            defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
            IntPtr hPrinter = IntPtr.Zero;
            //打开打印机
            if (OpenPrinter(printerName, out hPrinter, ref defaults))
            {
                int i = PrinterProperties(new WindowInteropHelper(win).Handle, hPrinter);
            }
        }

        /// <summary>
        /// 打印机首选项
        /// </summary>
        /// <param name="printerName"></param>
        /// <param name="win"></param>
        public static void OpenPrinterProperties(string printerName, Window win)
        {
            const int PRINTER_ACCESS_USE = 0x00000008;
            const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
            structPrinterDefaults defaults = new structPrinterDefaults();
            defaults.pDatatype = null;
            defaults.pDevMode = IntPtr.Zero;
            defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
            IntPtr hPrinter = IntPtr.Zero;
            //打开打印机
            if (OpenPrinter(printerName, out hPrinter, ref defaults))
            {
                int i = DocumentProperties(new WindowInteropHelper(win).Handle, hPrinter, printerName, IntPtr.Zero, IntPtr.Zero, DM_IN_BUFFER | DM_IN_PROMPT | DM_OUT_BUFFER);
            }
        }
    }
}