1,使用Win32_TCPIPPrinterPort来获取打印机的 TCP IP端口
/// /// 获取本地打印机TCPIP名字192.168.0.1 Win32_TCPIPPrinterPort /// /// private List GetLocalPrinterTcpIpList() { List listCom = new List(); ManagementScope scope = new ManagementScope(@"\root\cimv2"); //获取打印机IP名字 192.168.0.1 Win32_TCPIPPrinterPort var vComs = new ManagementObjectSearcher(scope, new ObjectQuery("select * from Win32_TCPIPPrinterPort")).Get(); foreach (var vCom in vComs) { listCom.Add(vCom.Properties["Name"].Value.ToString()); } return listCom; }
2,使用注册表方式来获取打印机的COM口,LPT端口,以及本地端口
/// /// 获取打印机COM LPT Local三种端口 /// /// private List GetPrinterComLptLocalPort() { List listRet = new List(); string strLocalPortPath = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports"; RegistryKey localMachineReg = Registry.LocalMachine; RegistryKey reg = null; reg = localMachineReg.OpenSubKey(strLocalPortPath, true); //用于读写
foreach (var vItem in reg.GetValueNames()) { if (vItem.Contains("Ne") && vItem.LastIndexOf(':') == vItem.Length - 1) //Ne开头的并且是冒号结尾的不加入端口中 { continue; } listRet.Add(vItem); } localMachineReg.Close();
return listRet; }
3,使用Win API获取(上述两种方式获取不是很全面),使用Win API 可以获取到LPT,COM ,USB等和在windows控制面板中 打印机端口列表看到的是一样的
class Myclass { //PortType enum //struct for PORT_INFO_2 [StructLayout(LayoutKind.Sequential)] public struct PORT_INFO_2 { public string pPortName; public string pMonitorName; public string pDescription; public PortType fPortType; internal int Reserved; }
[Flags] public enum PortType : int { write = 0x1, read = 0x2, redirected = 0x4, net_attached = 0x8 }
//Win32 API [DllImport("winspool.drv", EntryPoint = "EnumPortsA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] public static extern int EnumPorts(string pName, int Level, IntPtr lpbPorts, int cbBuf, ref int pcbNeeded, ref int pcReturned);
/// /// method for retrieving all ailable printer ports /// /// generic list populated with post names (i.e; COM1, LTP1, etc)
public List GetPortNames() { //variables needed for Win32 API calls int result; int needed = 0; int cnt = 0; IntPtr buffer = IntPtr.Zero; IntPtr port = IntPtr.Zero;
//list to hold the returned port names List ports = new List();
//new PORT_INFO_2 for holding the ports PORT_INFO_2[] portInfo = null;
//enumerate through to get the size of the memory we need result = EnumPorts("", 2, buffer, 0, ref needed, ref cnt); try { //allocate memory buffer = Marshal.AllocHGlobal(Convert.ToInt32(needed + 1));
//get list of port names result = EnumPorts("", 2, buffer, needed, ref needed, ref cnt);
//check results, if 0 (zero) then we got an error if (result != 0) { //set port value port = buffer;
//instantiate struct portInfo = new PORT_INFO_2[cnt];
//now loop through the returned count populating our array of PORT_INFO_2 objects for (int i = 0; i < cnt; i++) { portInfo[i] = (PORT_INFO_2)Marshal.PtrToStructure(port, typeof(PORT_INFO_2)); port = (IntPtr)(port.ToInt64() + Marshal.SizeOf(typeof(PORT_INFO_2))); } port = IntPtr.Zero; } else throw new Win32Exception(Marshal.GetLastWin32Error());
//now get what we want. Loop through al the //items in the PORT_INFO_2 Array and populate our generic list for (int i = 0; i < cnt; i++) { ports.Add(portInfo[i].pPortName); }
//sort the list ports.Sort();
return ports; } catch (Exception ex) { Console.WriteLine(string.Format("Error getting ailable ports: {0}", ex.Message)); Console.ReadLine(); return null; } finally { if (buffer != IntPtr.Zero) { Marshal.FreeHGlobal(buffer); buffer = IntPtr.Zero; port = IntPtr.Zero; } }
}
}