首页 > 学院 > 开发设计 > 正文

[C#] 获取打印机列表

2019-11-17 02:33:16
字体:
来源:转载
供稿:网友

[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 =
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表