[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:添加花名册,启动: 客户端发送请求到服务器获取好友列表信息,同时在项目中创建数据表,并保存好友列表到数据表中. ---->获取服务器保存好 ...
随机推荐
- .Net开发笔记(二十)创建一个需要授权的第三方组件
在使用需要授权的软件时,注册付费的目标是软件的使用者,我们开发人员平时用到的一些第三方组件也是需要授权付费的,也就是说,付费者是开发人员,并不是系统(使用了该第三方组件)的最终使用者. 以上两者的区别 ...
- Javascript本质第二篇:执行上下文
在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...
- 提供程序不支持 DatabaseExists
如果Oracle CodeFirst模式下要用EFProviderWrapperToolkit,那么会报告以下错误: 提供程序不支持 DatabaseExists. 这个错误是因为Oracle Cod ...
- 《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体
2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuc ...
- Maven常用插件
maven利用各种插件来管理构建项目,本文记录下工作中常用到的插件及使用方法.每个插件都会提供多个目标(goal),用于标示任务.各插件配置在pom.xml里,如下: <build> [. ...
- iOS创建安全的单例
创建安全的单例 #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; ...
- sublime text 下的Markdown写作
sublime text 2(3)下的Markdown写作 什么是 Markdown wiki Markdown 是一种方便记忆.书写的纯文本标记语言,用户可以使用这些标记符号以最小的输入代价生成极富 ...
- Trace Flag
Trace Flag能够影响Sql Server的行为,主要用于diagnose performance issue,官方解释是: Trace flags are used to temporaril ...
- Qt Undo Framework Demo
Qt Undo Framework Demo eryar@163.com Abstract. Qt’s Undo Framework is an implementation of the Comma ...
- 《ASP.NET MVC 5框架揭秘》样章发布
今天算是新作<ASP.NET MVC 5框架揭秘>正式上架销售的日子(目前本书在互动网已经到货),为了让更多适合的朋友们能够阅读此书,同时也避免让不适合的读者误买此书,特将此书的样章发布出 ...