一:获得本地安装的打印机列表
注:(如果在“设备和打印机”中已经添加了局域网的打印机设备,也算是本地安装的打印机;没有添加的则算作局域网打印机)
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 }
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 }
二:获取局域网打印机列表
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 }
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 }
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 }
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 }
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 }
参考资料:
http://www.pinvoke.net/default.aspx/winspool.EnumPrinters
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx