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

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

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. Logging with Log4net (二)

    log4net 是.net 的一款日志记录框架. 它提供了很多的方法来帮助记录日志: 使用起来也比较方便: 选中项目,点击右键,然后选择 Manage NuGet Packages... 安装log4 ...

  2. 玩转JavaScript OOP[2]——类的实现

    概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...

  3. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  4. 实战JS正则表达式

    -正则表达式是一种文本模式的匹配工具. -文章导读: --1.正则对象的属性和方法 --2.字符串对象的方法 --3.使用正则表达式: ---3.1 给字符串加上千分符 ---3.2 字符串中出现次数 ...

  5. 防刷票机制研究和.NET HttpRequest Proxy

    最近应朋友之约 测试他做的投票网站 防刷票机制能力如何,下面有一些心得和体会. 朋友网站用PHP写的,走的是HttpRequest,他一开始认为IP认证应该就差不多了.但说实话这种很low,手动更换代 ...

  6. CCLuaLoadChunksFromZIP加载后的require路径问题

    对于require来说,在LUA中的机制就是搜索path路径了.但对于CCLuaLoadChunksFromZIP加载的LUA文件来说,require的路径又是怎么样的呢? 我在服务器上有一个 oox ...

  7. 3dmax模型制作备忘录

    md2导出: http://thegreystudios.com/blog/?p=278 http://wenku.baidu.com/view/4d5652e2524de518964b7d89.ht ...

  8. Mongoose Schemas定义中timestamps选项的妙用

    在Node.js中使用MongoDB少不了Mongoose. 假设有如下Mongoose Schemas的定义: var ItemSchema = new mongoose.Schema({ biz: ...

  9. 实现 Math.Asin 迈克劳林(泰勒)展开式,结果比Math.Asin 慢一倍

    项目中需要快速求解Asin(x) 的近似值,原以为用泰勒展开式会快一些,结果比原生的慢一倍. Math.ASin        Time Elapsed:   9ms        Gen 0:    ...

  10. Java集合类的总结

    Java语言的java.until包中提供了一些集合类,这些集合类又被称为容器.说到集合就会想到数组,集合类与数组的不同之处是,数组的长度是固定的,集合的长度是可变的:数组用来存放基本数据类型,集合从 ...