zoukankan      html  css  js  c++  java
  • [C#] 获取打印机列表

    一:获得本地安装的打印机列表

    注:(如果在“设备和打印机”中已经添加了局域网的打印机设备,也算是本地安装的打印机;没有添加的则算作局域网打印机)

    1,通过 C# 中 PrinterSettings 对象获取,如下,然后通过 foreach 即可遍历 printers;

    PrinterSettings.StringCollection printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters;

    2,PrintHelper 类以及方法 GetEnumPrinters2,见文章最后部分;

    1 PRINTER_INFO_2[] printers = PrintHelper.GetEnumPrinters2();
    2 foreach (PRINTER_INFO_2 printer in printers)
    3 {
    4     listBox1.Items.Add(printer.pPrinterName);
    5 }
    View Code

    3,通过 ManagementObjectCollection (需要添加 System.Management 引用)来查询本地计算机中的打印机列表;

     1 // 获取本地打印机列表
     2 ManagementObjectCollection queryCollection;
     3 string sql = "SELECT * FROM Win32_Printer";
     4 Dictionary<string, ManagementObject> dict = new Dictionary<string, ManagementObject>();
     5 ManagementObjectSearcher query = new ManagementObjectSearcher(sql);
     6 queryCollection = query.Get();
     7 foreach (ManagementObject mo in queryCollection)
     8 {
     9     string oldName = mo["Name"].ToString();
    10     listBox1.Items.Add(oldName);
    11 }
    View Code

    二:获取局域网打印机列表

    1,PrintHelper 类以及方法 GetEnumPrinters2,见文章最后部分;

     1 PRINTER_INFO_1[] printers = PrintHelper.GetEnumPrinters();
     2 foreach (PRINTER_INFO_1 printer in printers)
     3 {
     4     if (-1 == printer.pName.IndexOf("!!"))
     5     {
     6         listBox1.Items.Add(printer.pName);
     7     }
     8     else
     9     {
    10         uint pcbNeeded = 0;
    11         uint pcReturned = 0;
    12         IntPtr pPrInfo4 = IntPtr.Zero;
    13         uint size = 0;
    14         string pNewName = printer.pName;
    15         PrintHelper.EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, 1, IntPtr.Zero, size, ref pcbNeeded, ref pcReturned);
    16         if (pcbNeeded != 0)
    17         {
    18             pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
    19             size = pcbNeeded;
    20             PrintHelper.EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, 1, pPrInfo4, size, ref pcbNeeded, ref pcReturned);
    21             PRINTER_INFO_1[] printerInfo1 = new PRINTER_INFO_1[pcReturned];
    22             int offset = pPrInfo4.ToInt32();
    23             Type type = typeof(PRINTER_INFO_1);
    24             int increment = Marshal.SizeOf(type);
    25             for (int i = 0; i < pcReturned; i++)
    26             {
    27                 printerInfo1[i] = (PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
    28                 offset += increment;
    29                 listBox1.Items.Add(printerInfo1[i].pName);
    30             }
    31             Marshal.FreeHGlobal(pPrInfo4);
    32         }
    33     }
    34 }
    View Code

     
    PrintHelper 类以及相关枚举和信息类定义

     1 public class PrintHelper
     2 {
     3     [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
     4     [return: MarshalAs(UnmanagedType.Bool)]
     5     public static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level, IntPtr pPrinterEnum, uint cbBuff, ref uint pcbNeeded, ref uint pcReturned);
     6 
     7     // 获取网络打印机
     8     public static PRINTER_INFO_1[] GetEnumPrinters(PrinterEnumFlags flags)
     9     {
    10         PRINTER_INFO_1[] printerInfo1 = new PRINTER_INFO_1[] { };
    11         uint pcbNeeded = 0;
    12         uint pcReturned = 0;
    13         IntPtr pPrInfo4 = IntPtr.Zero;
    14         uint size = 0;
    15         if (EnumPrinters(flags, null, 1, IntPtr.Zero, size, ref pcbNeeded, ref pcReturned))
    16         {
    17             return printerInfo1;
    18         }
    19         if (pcbNeeded != 0)
    20         {
    21             pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
    22             size = pcbNeeded;
    23             EnumPrinters(flags, null, 1, pPrInfo4, size, ref pcbNeeded, ref pcReturned);
    24             if (pcReturned != 0)
    25             {
    26                 printerInfo1 = new PRINTER_INFO_1[pcReturned];
    27                 int offset = pPrInfo4.ToInt32();
    28                 Type type = typeof(PRINTER_INFO_1);
    29                 int increment = Marshal.SizeOf(type);
    30                 for (int i = 0; i < pcReturned; i++)
    31                 {
    32                     printerInfo1[i] = (PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
    33                     offset += increment;
    34                 }
    35                 Marshal.FreeHGlobal(pPrInfo4);
    36             }
    37         }
    38 
    39         return printerInfo1;
    40     }
    41 
    42     // 获取本地打印机
    43     public static PRINTER_INFO_2[] GetEnumPrinters2()
    44     {
    45         PRINTER_INFO_2[] printerInfo2 =  new PRINTER_INFO_2[] { }; 
    46         uint pcbNeeded = 0;
    47         uint pcReturned = 0;
    48         IntPtr pPrInfo4 = IntPtr.Zero;
    49         if (EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2, IntPtr.Zero, 0, ref pcbNeeded, ref pcReturned))
    50         {
    51             return printerInfo2;
    52         }
    53         if (pcbNeeded != 0)
    54         {
    55             pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
    56             EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2, pPrInfo4, pcbNeeded, ref pcbNeeded, ref pcReturned);
    57             if (pcReturned != 0)
    58             {
    59                 printerInfo2 = new PRINTER_INFO_2[pcReturned];
    60                 int offset = pPrInfo4.ToInt32();
    61                 for (int i = 0; i < pcReturned; i++)
    62                 {
    63                     printerInfo2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2));
    64                     offset += Marshal.SizeOf(typeof(PRINTER_INFO_2));
    65                 }
    66                 Marshal.FreeHGlobal(pPrInfo4);
    67             }
    68         }
    69 
    70         return printerInfo2;
    71     }
    72 }
    PrintHelper
     1 [FlagsAttribute]
     2 public enum PrinterEnumFlags
     3 {
     4     PRINTER_ENUM_DEFAULT = 0x00000001,
     5     PRINTER_ENUM_LOCAL = 0x00000002,
     6     PRINTER_ENUM_CONNECTIONS = 0x00000004,
     7     PRINTER_ENUM_FAVORITE = 0x00000004,
     8     PRINTER_ENUM_NAME = 0x00000008,
     9     PRINTER_ENUM_REMOTE = 0x00000010,
    10     PRINTER_ENUM_SHARED = 0x00000020,
    11     PRINTER_ENUM_NETWORK = 0x00000040,
    12     PRINTER_ENUM_EXPAND = 0x00004000,
    13     PRINTER_ENUM_CONTAINER = 0x00008000,
    14     PRINTER_ENUM_ICONMASK = 0x00ff0000,
    15     PRINTER_ENUM_ICON1 = 0x00010000,
    16     PRINTER_ENUM_ICON2 = 0x00020000,
    17     PRINTER_ENUM_ICON3 = 0x00040000,
    18     PRINTER_ENUM_ICON4 = 0x00080000,
    19     PRINTER_ENUM_ICON5 = 0x00100000,
    20     PRINTER_ENUM_ICON6 = 0x00200000,
    21     PRINTER_ENUM_ICON7 = 0x00400000,
    22     PRINTER_ENUM_ICON8 = 0x00800000,
    23     PRINTER_ENUM_HIDE = 0x01000000
    24 }
    PrinterEnumFlags
     1 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
     2 public struct PRINTER_INFO_1
     3 {
     4     int flags;
     5     [MarshalAs(UnmanagedType.LPTStr)]
     6     public string pDescription;
     7     [MarshalAs(UnmanagedType.LPTStr)]
     8     public string pName;
     9     [MarshalAs(UnmanagedType.LPTStr)]
    10     public string pComment;
    11 }
    PRINTER_INFO_1
     1 [StructLayout(LayoutKind.Sequential)]
     2 public struct PRINTER_INFO_2
     3 {
     4     [MarshalAs(UnmanagedType.LPTStr)]
     5     public string pServerName;
     6     [MarshalAs(UnmanagedType.LPTStr)]
     7     public string pPrinterName;
     8     [MarshalAs(UnmanagedType.LPTStr)]
     9     public string pShareName;
    10     [MarshalAs(UnmanagedType.LPTStr)]
    11     public string pPortName;
    12     [MarshalAs(UnmanagedType.LPTStr)]
    13     public string pDriverName;
    14     [MarshalAs(UnmanagedType.LPTStr)]
    15     public string pComment;
    16     [MarshalAs(UnmanagedType.LPTStr)]
    17     public string pLocation;
    18     public IntPtr pDevMode;
    19     [MarshalAs(UnmanagedType.LPTStr)]
    20     public string pSepFile;
    21     [MarshalAs(UnmanagedType.LPTStr)]
    22     public string pPrintProcessor;
    23     [MarshalAs(UnmanagedType.LPTStr)]
    24     public string pDatatype;
    25     [MarshalAs(UnmanagedType.LPTStr)]
    26     public string pParameters;
    27     public IntPtr pSecurityDescriptor;
    28     public uint Attributes;
    29     public uint Priority;
    30     public uint DefaultPriority;
    31     public uint StartTime;
    32     public uint UntilTime;
    33     public uint Status;
    34     public uint cJobs;
    35     public uint AveragePPM;
    36 }
    PRINTER_INFO_2

    参考资料:

    http://www.pinvoke.net/default.aspx/winspool.EnumPrinters

    https://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx

  • 相关阅读:
    课后listview作业
    安卓sql
    activity带数据跳转
    安卓第四周作业
    15周作业
    十三周作业-集合
    十三周上机练习
    12周作业
    linux
    Questions.
  • 原文地址:https://www.cnblogs.com/memento/p/4301704.html
Copyright © 2011-2022 走看看