各位大虾,怎么样获取枚举机器上所有打印机的相关信息(打印机名、IP、型号)?

解决方案 »

  1.   


    using System.Drawing.Printing; 
    listBox1.Items.Clear();
    foreach (string printer in PrinterSettings.InstalledPrinters)
    {
       listBox1.Items.Add(printer);

      

  2.   

    名称楼上已经说了。IP对于本机的就没有了,对于网络打印机取名称的前几个字符串,形式一般如下:
    \\127.0.0.1\aaaaaa型号不好搞,软件获得的信息都是通过的打印机驱动,它没有型号的信息。只能通过打印机名称判断了(但名称可以手工修改,所以不准确)。
      

  3.   

    这是一个form的代码,你在form上加一个list就能运行,能获取打印机的所有信息using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;using System.Drawing.Printing;
    using System.Runtime.InteropServices;
    namespace WinAppTest
    {
        public partial class PrinterList : Form
        {
            #region 预定义类型        [FlagsAttribute]
            public enum PrinterEnumFlags
            {
                PRINTER_ENUM_DEFAULT = 0x00000001,
                PRINTER_ENUM_LOCAL = 0x00000002,
                PRINTER_ENUM_CONNECTIONS = 0x00000004,
                PRINTER_ENUM_FAVORITE = 0x00000004,
                PRINTER_ENUM_NAME = 0x00000008,
                PRINTER_ENUM_REMOTE = 0x00000010,
                PRINTER_ENUM_SHARED = 0x00000020,
                PRINTER_ENUM_NETWORK = 0x00000040,
                PRINTER_ENUM_EXPAND = 0x00004000,
                PRINTER_ENUM_CONTAINER = 0x00008000,
                PRINTER_ENUM_ICONMASK = 0x00ff0000,
                PRINTER_ENUM_ICON1 = 0x00010000,
                PRINTER_ENUM_ICON2 = 0x00020000,
                PRINTER_ENUM_ICON3 = 0x00040000,
                PRINTER_ENUM_ICON4 = 0x00080000,
                PRINTER_ENUM_ICON5 = 0x00100000,
                PRINTER_ENUM_ICON6 = 0x00200000,
                PRINTER_ENUM_ICON7 = 0x00400000,
                PRINTER_ENUM_ICON8 = 0x00800000,
                PRINTER_ENUM_HIDE = 0x01000000
            }        [StructLayout(LayoutKind.Sequential)]
            public struct PRINTER_INFO_2
            {
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pServerName;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pPrinterName;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pShareName;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pPortName;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pDriverName;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pComment;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pLocation;
                public IntPtr pDevMode;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pSepFile;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pPrintProcessor;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pDatatype;
                [MarshalAs(UnmanagedType.LPTStr)]
                public string pParameters;
                public IntPtr pSecurityDescriptor;
                public uint Attributes;
                public uint Priority;
                public uint DefaultPriority;
                public uint StartTime;
                public uint UntilTime;
                public uint Status;
                public uint cJobs;
                public uint AveragePPM;
            }        #endregion        #region 引用 WindowsAPI
            //引用API声明
            [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool EnumPrinters(
                                            PrinterEnumFlags Flags,
                                            string Name,
                                            uint Level,
                                            IntPtr pPrinterEnum,
                                            uint cbBuf,
                                            ref uint pcbNeeded,
                                            ref uint pcReturned
                                                    );        #endregion        #region 遍历打印机        /// <summary>
            /// 遍历打印机
            /// </summary>
            /// <param name="Flags"></param>
            /// <returns></returns>
            public static PRINTER_INFO_2[] EnumPrinters(PrinterEnumFlags Flags)
            {
                PRINTER_INFO_2[] Info2 = null;            uint cbNeeded = 0;
                uint cReturned = 0;            bool ret = EnumPrinters(Flags, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned);
                IntPtr pAddr = Marshal.AllocHGlobal((int)cbNeeded);
                ret = EnumPrinters(Flags, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned);            if(ret)
                {
                    Info2 = new PRINTER_INFO_2[cReturned];
                    int offset = pAddr.ToInt32();
                    for (int i = 0; i < cReturned; i++)
                    {
                        Info2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2));
                        offset += Marshal.SizeOf(typeof(PRINTER_INFO_2));
                    }                Marshal.FreeHGlobal(pAddr);
                }            return Info2;
            }        #endregion        public PrinterList()
            {
                InitializeComponent();
            }        private void PrinterList_Load(object sender, EventArgs e)
            {
                listBox1.Items.Clear();            foreach (string printer in PrinterSettings.InstalledPrinters)
                {
                    listBox1.Items.Add(printer);
                }            listBox1.Items.Clear();
                PRINTER_INFO_2[] printInfo;            printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);            if (printInfo != null && printInfo.Length >= 0)
                {
                    for (int i = 0; i < printInfo.Length; i++)
                    {
                        listBox1.Items.Add(safestring(printInfo[i].pServerName));
                        listBox1.Items.Add(printInfo[i].pShareName);
                        listBox1.Items.Add(printInfo[i].pPrinterName);
                        listBox1.Items.Add(printInfo[i].pPortName);
                        listBox1.Items.Add(printInfo[i].Status);
                        //Console.WriteLine(printInfo[i].pPrinterName);
                    }
                }   
            }        private string safestring(object s)
            {
                if (s == null) return "";
                return s.ToString();
            }    }
    }
      

  4.   

    有这个命名空间
    System.Drawing.Printing; 
    我觉得就没有问题
      

  5.   

    通过改变
    printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL);
    中的参数可以查看不同范围内的打印机设置,可以挨个测试
    如可以改成
    printInfo = EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_CONNECTIONS);另外
    listBox1.Items.Add(safestring(printInfo[i].pServerName));
                        listBox1.Items.Add(printInfo[i].pShareName);
                        listBox1.Items.Add(printInfo[i].pPrinterName);
                        listBox1.Items.Add(printInfo[i].pPortName);
                        listBox1.Items.Add(printInfo[i].Status);
    还有很多信息没显示,可以根据你的需要显示
      

  6.   

    这个需要使用ManagementObjectSearcher。
    如果是检查本地机器的,可以这样:
    PrintDocument prtdoc = new PrintDocument();
    if (PrinterSettings.InstalledPrinters.Count == 0) //检查有没有安装打印机
             strResult = "No printer installed on your machine.";
    else if (prtdoc.PrinterSettings.PrinterName == "<no default printer>") //检查有没有设置默认打印机
    {
             strResult = "Please set one printer as default printer.";
    }
    else if (!prtdoc.PrinterSettings.IsValid) //检测文档的打印设置是否合法
    {
             strResult = "Printer Settings is invalid.";
    }