如何获取LAN中连接打印机的计算机名称和IP

通常在局域网中共享打印机,我们可以通过Windows“添加远程打印机”将局域网中的这些共享计算机添加到我们的机器中。 我希望得到这样的添加打印机列表,并通过C#获得在线状态和打印机设置。 添加的打印机列表可以通过以下方式获得

System.Drawing.Printing.PrinterSettings.InstalledPrinters 

通过这段代码,我可以将combobox中添加的打印机列表。 问题是如何通过c#代码获取每台打印机的在线状态以及其他可能的设置。 请帮忙。

作为WMI的替代方法,您可以使用Print Spooler API收集有关打印机的详细信息。 API的大多数P / Invoke签名都可以在http://www.pinvoke.net上找到 。

打开打印机的句柄: http : //www.pinvoke.net/default.aspx/winspool.OpenPrinter

收集打印机信息: http : //www.pinvoke.net/default.aspx/winspool.GetPrinterData

编辑:

根据要求快速粉碎您可以从PrintSpoolerApi收集的内容的示例。

PrintSpoolerAPIExample:

创建新的控制台项目并用此替换Program.cs中的所有代码(.NET 3.5及更高版本,由于类型推断),机器上可用的每台打印机的打印机详细信息(本地或联网)将打印到控制台。 状态值是您感兴趣的。“就绪”的状态代码为0,通过禁用打印机和禁用网络连接到网络打印机来查看状态更改。

 using System; using System.Collections; using System.ComponentModel; using System.Runtime.InteropServices; using System.Text; namespace PrintSpoolerAPIExample { class Program { static void Main(string[] args) { var printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters as IEnumerable; foreach (string printer in printers) { var printerInfo = PrintSpoolerApi.GetPrinterProperty(printer); StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("ServerName:{0}", printerInfo.ServerName)); sb.AppendLine(string.Format("PrinterName:{0}", printerInfo.PrinterName)); sb.AppendLine(string.Format("ShareName:{0}", printerInfo.ShareName)); sb.AppendLine(string.Format("PortName:{0}", printerInfo.PortName)); sb.AppendLine(string.Format("DriverName:{0}", printerInfo.DriverName)); sb.AppendLine(string.Format("Comment:{0}", printerInfo.Comment)); sb.AppendLine(string.Format("Location:{0}", printerInfo.Location)); sb.AppendLine(string.Format("DevMode:{0}", printerInfo.DevMode)); sb.AppendLine(string.Format("SepFile:{0}", printerInfo.SepFile)); sb.AppendLine(string.Format("PrintProcessor:{0}", printerInfo.PrintProcessor)); sb.AppendLine(string.Format("Datatype:{0}", printerInfo.Datatype)); sb.AppendLine(string.Format("Parameters:{0}", printerInfo.Parameters)); sb.AppendLine(string.Format("Attributes:{0}", printerInfo.Attributes)); sb.AppendLine(string.Format("Priority:{0}", printerInfo.Priority)); sb.AppendLine(string.Format("DefaultPriority:{0}", printerInfo.DefaultPriority)); sb.AppendLine(string.Format("StartTime:{0}", printerInfo.StartTime)); sb.AppendLine(string.Format("UntilTime:{0}", printerInfo.UntilTime)); sb.AppendLine(string.Format("Status:{0}", printerInfo.Status)); sb.AppendLine(string.Format("Jobs:{0}", printerInfo.Jobs)); sb.AppendLine(string.Format("AveragePpm:{0}", printerInfo.AveragePpm)); Console.WriteLine(sb.ToString()); } Console.ReadLine(); } } class PrintSpoolerApi { [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool OpenPrinter( [MarshalAs(UnmanagedType.LPTStr)] string printerName, out IntPtr printerHandle, PrinterDefaults printerDefaults); [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool GetPrinter( IntPtr printerHandle, int level, IntPtr printerData, int bufferSize, ref int printerDataSize); [DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool ClosePrinter( IntPtr printerHandle); [StructLayout(LayoutKind.Sequential)] public struct PrinterDefaults { public IntPtr pDatatype; public IntPtr pDevMode; public int DesiredAccess; } public enum PrinterProperty { ServerName, PrinterName, ShareName, PortName, DriverName, Comment, Location, PrintProcessor, Datatype, Parameters, Attributes, Priority, DefaultPriority, StartTime, UntilTime, Status, Jobs, AveragePpm }; public struct PrinterInfo2 { [MarshalAs(UnmanagedType.LPTStr)] public string ServerName; [MarshalAs(UnmanagedType.LPTStr)] public string PrinterName; [MarshalAs(UnmanagedType.LPTStr)] public string ShareName; [MarshalAs(UnmanagedType.LPTStr)] public string PortName; [MarshalAs(UnmanagedType.LPTStr)] public string DriverName; [MarshalAs(UnmanagedType.LPTStr)] public string Comment; [MarshalAs(UnmanagedType.LPTStr)] public string Location; public IntPtr DevMode; [MarshalAs(UnmanagedType.LPTStr)] public string SepFile; [MarshalAs(UnmanagedType.LPTStr)] public string PrintProcessor; [MarshalAs(UnmanagedType.LPTStr)] public string Datatype; [MarshalAs(UnmanagedType.LPTStr)] public string Parameters; public IntPtr SecurityDescriptor; public uint Attributes; public uint Priority; public uint DefaultPriority; public uint StartTime; public uint UntilTime; public uint Status; public uint Jobs; public uint AveragePpm; } public static PrinterInfo2 GetPrinterProperty(string printerUncName) { var printerInfo2 = new PrinterInfo2(); var pHandle = new IntPtr(); var defaults = new PrinterDefaults(); try { //Open a handle to the printer bool ok = OpenPrinter(printerUncName, out pHandle, defaults); if (!ok) { //OpenPrinter failed, get the last known error and thrown it throw new Win32Exception(Marshal.GetLastWin32Error()); } //Here we determine the size of the data we to be returned //Passing in 0 for the size will force the function to return the size of the data requested int actualDataSize = 0; GetPrinter(pHandle, 2, IntPtr.Zero, 0, ref actualDataSize); int err = Marshal.GetLastWin32Error(); if (err == 122) { if (actualDataSize > 0) { //Allocate memory to the size of the data requested IntPtr printerData = Marshal.AllocHGlobal(actualDataSize); //Retrieve the actual information this time GetPrinter(pHandle, 2, printerData, actualDataSize, ref actualDataSize); //Marshal to our structure printerInfo2 = (PrinterInfo2)Marshal.PtrToStructure(printerData, typeof(PrinterInfo2)); //We've made the conversion, now free up that memory Marshal.FreeHGlobal(printerData); } } else { throw new Win32Exception(err); } return printerInfo2; } finally { //Always close the handle to the printer ClosePrinter(pHandle); } } } } 

如果需要,您可以从API检索更多详细信息。

在线状态

请考虑此CodeProject文章“ 如何检查您的打印机是否已连接 ”示例代码使用WMI和System.Management命名空间。

复制/粘贴:

  ManagementScope scope = new ManagementScope(@"\root\cimv2"); scope.Connect(); // Select Printers from WMI Object Collections ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer"); string printerName = ""; foreach (ManagementObject printer in searcher.Get()) { printerName = printer["Name"].ToString().ToLower(); if (printerName.Equals(@"hp deskjet 930c")) { Console.WriteLine("Printer = " + printer["Name"]); if (printer["WorkOffline"].ToString().ToLower().Equals("true")) { // printer is offline by user Console.WriteLine("Your Plug-N-Play printer is not connected."); } else { // printer is not offline Console.WriteLine("Your Plug-N-Play printer is connected."); } } } } 

使用WMI是此类任务的常见选项……

  ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer"); foreach (ManagementObject printer in searcher.Get()) { string printerName = printer["Name"].ToString().ToLower(); Console.WriteLine("Printer :" + printerName); PrintProps(printer, "Status"); PrintProps(printer, "PrinterState"); PrintProps(printer, "PrinterStatus"); } } static void PrintProps(ManagementObject o, string prop) { try { Console.WriteLine(prop + "|" + o[prop]); } catch (Exception e) { Console.Write(e.ToString()); } }