[C#] 获取打印机列表
一:获得本地安装的打印机列表
注:(如果在“设备和打印机”中已经添加了局域网的打印机设备,也算是本地安装的打印机;没有添加的则算作局域网打印机)
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#] 获取打印机列表的更多相关文章
- C# 获取打印机列表以及串口
C# 获取打印机列表以及默认打印机.串口列表. /// <summary> /// 获取本地已安装的打印机 /// </summary> /// <returns> ...
- C-Lodop获取打印机列表Create_Printer_List
C-Lodop获取打印机列表Create_Printer_List,此方法Lodop不支持,是C-Lodop特有的函数,客户端本地打印单独用c-lodop,或集中打印等,可以获得本机或云主机的打印机列 ...
- Lodop在页面获取打印机列表 选择打印机预览
利用GET_PRINTER_COUNT,获取打印机个数,然后用GET_PRINTER_NAME(intPrinterIndex);循环获取打印机名称,添加到list列表里,可以让用户在页面就选择打印机 ...
- C#获取本地打印机列表,并将指定打印机设置为默认打印机
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- 获取WINDOWS打印机列表
获取WINDOWS打印机列表 如何知道WINDOWS已经安装了哪些打印机? 1) usesVcl.Printers 2) Printer.Printers // property Printers: ...
- .Net中获取打印机的相关信息
原文:.Net中获取打印机的相关信息 新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友. Printe ...
- SQL Server获取月度列表
-- 获取月度列表 if exists(select 1 from sysobjects where name = 'proc_GetDateMonthList' and type = 'p') dr ...
- python 获取一个列表有多少连续列表
python 获取一个列表有多少连续列表 例如 有列表 [1,2,3] 那么连续列表就是 [1,2],[2,3],[1,2,3] 程序实现如下: 运行结果:
- XMPP框架下微信项目总结(5)花名册获取(好友列表)
---->概念 ---->添加花名册 ps:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...
随机推荐
- [解惑]JavaScript事件机制
群里童鞋问到关于事件传播的一个问题:“事件捕获的时候,阻止冒泡,事件到达目标之后,还会冒泡吗?”. 初学 JS 的童鞋经常会有诸多疑问,我在很多 QQ 群也混了好几年了,耳濡目染也也收获了不少,以后会 ...
- C# 6.0 功能预览 (二)
在Language Feature Status上面看到,其实更新的并不是特别多,为了不会误导看了C# 6.0 功能预览 (一)的园友,现在把官方的更新列表拿了过来,供大家参考 Roslyn 编译平台 ...
- 【干货】JS版汉字与拼音互转终极方案,附简单的JS拼音输入法
前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...
- Android开发学习之路-Android6.0运行时权限
在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用.这对于用户来说,无疑是一个提升安全性的做法.那么对于开发者,应该怎 ...
- Java 网络爬虫获取页面源代码
原博文:http://www.cnblogs.com/xudong-bupt/archive/2013/03/20/2971893.html 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网 ...
- WebDriver--操控浏览器
前一篇讲述了元素的定位方法,现在开始练习如何写自动化测试脚本 我使用的编辑工具是PyCharm,今后该博客中所写的有关Python脚本,都是在该工具中编写的. WebDriver提供了控制浏览器大小. ...
- salesforce 零基础学习(四十七) 数据加密简单介绍
对于一个项目来说,除了稳定性以及健壮性以外,还需要有较好的安全性,此篇博客简单描述salesforce中关于安全性的一点小知识,特别感谢公司中的nate大神和鹏哥让我学到了新得知识. 项目简单背景: ...
- Cookie与Session
再说Cookie与Session之前,先要了解一下http协议. 何为http协议: http协议即超文本传输协议,一种基于浏览器请求与服务器响应的协议,该协议主要的特点就是它是一种无状态的协议(只针 ...
- SSRS3: Credentials配置
1,Service Account Service Account 是Reporting Service 运行的账户,可以通过查看Windows 的 Service 来查看,强烈建议使用 Report ...
- Sql Server系列:DBCC命令
DBCC(Database Base Consistency Checker,数据库一致性检查程序)命令用于验证数据库完整性.查找错误和分析系统使用情况等. 1. DBCC CHECKALLOC 检查 ...