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

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

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. 启动App的Intent

    类似桌面图标打开App的Intent 程序中需要一种通知,点击后的效果需要像点击桌面图标那样: 程序在前台就什么也不干. 程序在后台,就切换到前台. 程序未启动,就启动程序. 点击通知后,通知本身跳转 ...

  2. UITableView(一)

    #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource, ...

  3. Fd.Service 轻量级WebApi框架

    News December 06 2014: Version 1.0.0.8Add Register Route Configuration iis 7 Integrated Mode: <sy ...

  4. 我的权限系统设计实现MVC4 + WebAPI + EasyUI + Knockout(一)

    一.前言 之前的博客一直都还没写到框架的实现及权限系统,今天开始写我的权限系统,我以前做过的项目基本上都有权限管理这个模块,但各个系统都会有一些不太一样,有些简单点,有些稍微复杂一点,一句话,我们做的 ...

  5. JavaScript面试时候的坑洼沟洄——表达式与运算符

    上篇博客JavaScript面试时候的坑洼沟洄--数据类型总结了一下JavaScript数据类型几转换的相关知识,很多朋友可能和我一样,买了书后对数据类型啊.运算符啊.语句啊都是扫两眼或直接略过的,自 ...

  6. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

    第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...

  7. WinRAR 4.20 beta2 key!注册文件 注册码

    WinRAR 4.20 beta2 key!注册文件 注册码 WinRAR 4.20 beta2注册文件 WinRAR 4.20 beta2 working key ================= ...

  8. iOS----- Crash 分析(文三)- 符号化崩溃日志

    未符号化的崩溃日志就象一本天书,看不懂,更别谈分析崩溃原因了.所以我们在分析日志之前,要把日志翻译成我们可以看得懂的文字.这一步我们称之为符号化. 在iOS Crash分析(文一)中已经提到过符号化的 ...

  9. DAC Usage2:通过DAC实现DB Schema的Migration和Upgrade

    一,Introduce Extract DAC 是从现存的DB中创建DAC,抽取DB Object的definition 和 与之相关的实例级别的元素,比如Login,以及Login 和User之间的 ...

  10. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...