赛派号

添加打印机ip地址和端口名称 C# 获取打印机端口列表

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;                 }             }

        }

    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lsinopec@gmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了