一:获得本地安装的打印机列表

注:(如果在“设备和打印机”中已经添加了局域网的打印机设备,也算是本地安装的打印机;没有添加的则算作局域网打印机)

1,通过 C# 中 PrinterSettings 对象获取,如下,然后通过 foreach 即可遍历 printers;

PrinterSettings.StringCollection printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters;

2,PrintHelper 类以及方法 GetEnumPrinters2,见文章最后部分;

 PRINTER_INFO_2[] printers = PrintHelper.GetEnumPrinters2();
foreach (PRINTER_INFO_2 printer in printers)
{
listBox1.Items.Add(printer.pPrinterName);
}

3,通过 ManagementObjectCollection (需要添加 System.Management 引用)来查询本地计算机中的打印机列表;

 // 获取本地打印机列表
ManagementObjectCollection queryCollection;
string sql = "SELECT * FROM Win32_Printer";
Dictionary<string, ManagementObject> dict = new Dictionary<string, ManagementObject>();
ManagementObjectSearcher query = new ManagementObjectSearcher(sql);
queryCollection = query.Get();
foreach (ManagementObject mo in queryCollection)
{
string oldName = mo["Name"].ToString();
listBox1.Items.Add(oldName);
}

二:获取局域网打印机列表

1,PrintHelper 类以及方法 GetEnumPrinters2,见文章最后部分;

 PRINTER_INFO_1[] printers = PrintHelper.GetEnumPrinters();
foreach (PRINTER_INFO_1 printer in printers)
{
if (- == printer.pName.IndexOf("!!"))
{
listBox1.Items.Add(printer.pName);
}
else
{
uint pcbNeeded = ;
uint pcReturned = ;
IntPtr pPrInfo4 = IntPtr.Zero;
uint size = ;
string pNewName = printer.pName;
PrintHelper.EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, , IntPtr.Zero, size, ref pcbNeeded, ref pcReturned);
if (pcbNeeded != )
{
pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
size = pcbNeeded;
PrintHelper.EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_NAME, pNewName, , pPrInfo4, size, ref pcbNeeded, ref pcReturned);
PRINTER_INFO_1[] printerInfo1 = new PRINTER_INFO_1[pcReturned];
int offset = pPrInfo4.ToInt32();
Type type = typeof(PRINTER_INFO_1);
int increment = Marshal.SizeOf(type);
for (int i = ; i < pcReturned; i++)
{
printerInfo1[i] = (PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
offset += increment;
listBox1.Items.Add(printerInfo1[i].pName);
}
Marshal.FreeHGlobal(pPrInfo4);
}
}
}

PrintHelper 类以及相关枚举和信息类定义

 public class PrintHelper
{
[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EnumPrinters(PrinterEnumFlags Flags, string Name, uint Level, IntPtr pPrinterEnum, uint cbBuff, ref uint pcbNeeded, ref uint pcReturned); // 获取网络打印机
public static PRINTER_INFO_1[] GetEnumPrinters(PrinterEnumFlags flags)
{
PRINTER_INFO_1[] printerInfo1 = new PRINTER_INFO_1[] { };
uint pcbNeeded = ;
uint pcReturned = ;
IntPtr pPrInfo4 = IntPtr.Zero;
uint size = ;
if (EnumPrinters(flags, null, , IntPtr.Zero, size, ref pcbNeeded, ref pcReturned))
{
return printerInfo1;
}
if (pcbNeeded != )
{
pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
size = pcbNeeded;
EnumPrinters(flags, null, , pPrInfo4, size, ref pcbNeeded, ref pcReturned);
if (pcReturned != )
{
printerInfo1 = new PRINTER_INFO_1[pcReturned];
int offset = pPrInfo4.ToInt32();
Type type = typeof(PRINTER_INFO_1);
int increment = Marshal.SizeOf(type);
for (int i = ; i < pcReturned; i++)
{
printerInfo1[i] = (PRINTER_INFO_1)Marshal.PtrToStructure(new IntPtr(offset), type);
offset += increment;
}
Marshal.FreeHGlobal(pPrInfo4);
}
} return printerInfo1;
} // 获取本地打印机
public static PRINTER_INFO_2[] GetEnumPrinters2()
{
PRINTER_INFO_2[] printerInfo2 = new PRINTER_INFO_2[] { };
uint pcbNeeded = ;
uint pcReturned = ;
IntPtr pPrInfo4 = IntPtr.Zero;
if (EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, , IntPtr.Zero, , ref pcbNeeded, ref pcReturned))
{
return printerInfo2;
}
if (pcbNeeded != )
{
pPrInfo4 = Marshal.AllocHGlobal((int)pcbNeeded);
EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, , pPrInfo4, pcbNeeded, ref pcbNeeded, ref pcReturned);
if (pcReturned != )
{
printerInfo2 = new PRINTER_INFO_2[pcReturned];
int offset = pPrInfo4.ToInt32();
for (int i = ; i < pcReturned; i++)
{
printerInfo2[i] = (PRINTER_INFO_2)Marshal.PtrToStructure(new IntPtr(offset), typeof(PRINTER_INFO_2));
offset += Marshal.SizeOf(typeof(PRINTER_INFO_2));
}
Marshal.FreeHGlobal(pPrInfo4);
}
} return printerInfo2;
}
}

PrintHelper

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

PrinterEnumFlags

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct PRINTER_INFO_1
{
int flags;
[MarshalAs(UnmanagedType.LPTStr)]
public string pDescription;
[MarshalAs(UnmanagedType.LPTStr)]
public string pName;
[MarshalAs(UnmanagedType.LPTStr)]
public string pComment;
}

PRINTER_INFO_1

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

PRINTER_INFO_2

参考资料:

http://www.pinvoke.net/default.aspx/winspool.EnumPrinters

https://msdn.microsoft.com/en-us/library/windows/desktop/dd162692(v=vs.85).aspx

[C#] 获取打印机列表的更多相关文章

  1. C# 获取打印机列表以及串口

    C# 获取打印机列表以及默认打印机.串口列表. /// <summary> /// 获取本地已安装的打印机 /// </summary> /// <returns> ...

  2. C-Lodop获取打印机列表Create_Printer_List

    C-Lodop获取打印机列表Create_Printer_List,此方法Lodop不支持,是C-Lodop特有的函数,客户端本地打印单独用c-lodop,或集中打印等,可以获得本机或云主机的打印机列 ...

  3. Lodop在页面获取打印机列表 选择打印机预览

    利用GET_PRINTER_COUNT,获取打印机个数,然后用GET_PRINTER_NAME(intPrinterIndex);循环获取打印机名称,添加到list列表里,可以让用户在页面就选择打印机 ...

  4. C#获取本地打印机列表,并将指定打印机设置为默认打印机

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  5. 获取WINDOWS打印机列表

    获取WINDOWS打印机列表 如何知道WINDOWS已经安装了哪些打印机? 1) usesVcl.Printers 2) Printer.Printers  // property Printers: ...

  6. .Net中获取打印机的相关信息

    原文:.Net中获取打印机的相关信息 新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友. Printe ...

  7. SQL Server获取月度列表

    -- 获取月度列表 if exists(select 1 from sysobjects where name = 'proc_GetDateMonthList' and type = 'p') dr ...

  8. python 获取一个列表有多少连续列表

    python 获取一个列表有多少连续列表 例如 有列表 [1,2,3] 那么连续列表就是 [1,2],[2,3],[1,2,3] 程序实现如下: 运行结果:

  9. XMPP框架下微信项目总结(5)花名册获取(好友列表)

    ---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...

随机推荐

  1. Windows错误码解析

    C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通 ...

  2. Android属性动画源代码解析(超详细)

    本文假定你已经对属性动画有了一定的了解,至少使用过属性动画.下面我们就从属性动画最简单的使用开始. ObjectAnimator .ofInt(target,propName,values[]) .s ...

  3. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

  4. Tomcat的目录结构

    bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口启动T ...

  5. PDO 数据访问抽象层

    1.操作其它数据库 (1)造对象 $dsn = "mysql:dbname=test3;host=localhost"; //数据源:两个参数:数据库驱动,链接数据库 $pdo = ...

  6. JMeter--一、安装JMeter

    Apache JMeter是Apache组织开发的基于Java的接口和性能测试工具. 作用: 1.能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC). ...

  7. PHP面向对象笔记

    一.构造函数.析构函数(1)构造函数:__construct()说明:对象被实例化时调用,可带参数例: $obj = new A($a,$b); (2)析构函数:_destruct()说明:页面执行结 ...

  8. 小谈Java里的线程

    今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...

  9. 使用未付费的账号真机调试 iOS 程序,过几天后程序一打开就会闪退

    使用未付费的苹果开发者账号真机调试 iOS 程序,过几天后程序一打开就会闪退.   解决办法: 删除 Provisioning Profile,重新配置一次. 终极解决办法:花钱购买苹果开发者账号. ...

  10. jQuery第二篇 (帅哥)

    1.1 jQuery操作DOM jQuery课程的目标:学会使用jQuery设计常见效果 选择器 基本选择器:#id ..class .element.* . 层级选择器: 空格.>.+.~ 基 ...