C#添加本地打印机
class Program
{
static void Main(string[] args)
{
const string printerName = "Print to file";
const string portName = "FILE:";
const string driverName = "ZEBRA R110Xi4 300DPI"; PrinterPorts printerPorts = new PrinterPorts(); var portNames = printerPorts.GetPortNames();
//判断端口是否存在
if (!portNames.Contains(portName))
{
Console.WriteLine("{0} port is not existed", portName);
return;
} var driverNames = GetDrivers();
//判断Driver是否存在
if (!driverNames.Contains(driverName))
{
Console.WriteLine("{0} driver is not existed", driverName);
return;
} AddPrinter(printerName, portName, driverName); Console.ReadKey();
} private static void AddPrinter(string printerName, string portName,string printerDriver)
{
try
{
//init Win32_Printer class
var printerClass = new ManagementClass("Win32_Printer"); //create new Win32_Printer object
ManagementObject printerObject = printerClass.CreateInstance(); if (printerObject == null)
{
throw new Exception("printerObject is null");
} printerObject["PortName"] = portName;
//set driver and device names
printerObject["DriverName"] = printerDriver; printerObject["DeviceID"] = printerName; // specify put options: update or create
PutOptions options = new PutOptions();
options.Type = PutType.UpdateOrCreate;
//put a newly created object to WMI objects set
printerObject.Put(options);
}
catch (Exception ex)
{
throw new Exception(String.Format("WMI exception: {0}", ex.Message));
}
} /// <summary>
/// Get's a list of drives installed on the computer
/// </summary>
/// <returns></returns>
private static List<string> GetDrivers()
{
var drivers = new List<string>(); var selectQuery = new SelectQuery("Win32_PrinterDriver");
var searcher = new ManagementObjectSearcher(selectQuery); foreach (ManagementObject printerDriver in searcher.Get())
{
// Your code here.
var obj = printerDriver["name"];
string name = string.Empty; if (obj != null)
{
name = obj.ToString().Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)[];
} drivers.Add(name);
} return drivers;
} }
class PrinterPorts
{
//PortType enum
[Flags]
public enum PortType : int
{
write = 0x1,
read = 0x2,
redirected = 0x4,
net_attached = 0x8
} //struct for PORT_INFO_2
[StructLayout(LayoutKind.Sequential)]
public struct PORT_INFO_2
{
public string pPortName;
public string pMonitorName;
public string pDescription;
public PortType fPortType;
internal int Reserved;
} //Win32 API
[DllImport("winspool.drv", EntryPoint = "EnumPortsA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int EnumPorts(string pName, int Level, IntPtr lpbPorts, int cbBuf, ref int pcbNeeded, ref int pcReturned); /// <summary>
/// method for retrieving all available printer ports
/// </summary>
/// <returns>generic list populated with post names (i.e; COM1, LTP1, etc)</returns>
public List<string> GetPortNames()
{
//variables needed for Win32 API calls
int result; int needed = ; int cnt = ; IntPtr buffer = IntPtr.Zero; IntPtr port = IntPtr.Zero; //list to hold the returned port names
List<string> ports = new List<string>(); //new PORT_INFO_2 for holding the ports
PORT_INFO_2[] portInfo = null; //enumerate through to get the size of the memory we need
result = EnumPorts("", , buffer, , ref needed, ref cnt);
try
{ //allocate memory
buffer = Marshal.AllocHGlobal(Convert.ToInt32(needed + )); //get list of port names
result = EnumPorts("", , buffer, needed, ref needed, ref cnt); //check results, if 0 (zero) then we got an error
if (result != )
{
//set port value
port = buffer; //instantiate struct
portInfo = new PORT_INFO_2[cnt]; //now loop through the returned count populating our array of PORT_INFO_2 objects
for (int i = ; i < cnt; i++)
{
portInfo[i] = (PORT_INFO_2)Marshal.PtrToStructure(port, typeof(PORT_INFO_2));
port = (IntPtr)(port.ToInt32() + Marshal.SizeOf(typeof(PORT_INFO_2)));
}
port = IntPtr.Zero;
}
else
throw new Win32Exception(Marshal.GetLastWin32Error()); //now get what we want. Loop through al the
//items in the PORT_INFO_2 Array and populate our generic list
for (int i = ; i < cnt; i++)
{
ports.Add(portInfo[i].pPortName);
} //sort the list
ports.Sort();
return ports;
}
finally
{
if (buffer != IntPtr.Zero)
{
Marshal.FreeHGlobal(buffer);
buffer = IntPtr.Zero;
port = IntPtr.Zero; }
}
}
}
C#添加本地打印机的更多相关文章
- AD组策略添加本地账号、设置允许ping回显
AD组策略添加本地账号 1. 管理工具--组策略管理--选择相应GPO(编辑)----首选项--控制面板设置--本地用户和组--右键添加账号 2.域成员计算机刷新组策略(gpupdate/force) ...
- maven添加本地jar包
今天遇到一个mavan仓库中没有的jar包, 故只能添加本地jar包, 花了不少时间找资料,终于OK.故在此记录. 1. 第一次,在网上看到说可以用<systemPath> 解决, 如下: ...
- Sql server之路 (三)添加本地数据库SDF文件
12月25日 今天搞了半天 添加本地数据库Sdf文件到项目里.总是出现问题. 安装环境 Vs2008 没有安装的环境 1.Vs2008 sp1 2. 适用于 Windows 桌面的 Microsoft ...
- [原]逆向iOS SDK -- “添加本地通知”的流程分析
观点: 代码面前没有秘密 添加通知的 Demo 代码 - (void)scheduleOneLocalNotification { [[UIApplication sharedApplication] ...
- maven添加本地依赖包方法
1.某些情况下不方便上传本地依赖包到Maven repository,可以通过下面方法添加本地依赖包. 2.方法 1).pom.xml中添加以下代码块 <dependency> <g ...
- 在Android Studio添加本地aar包引用
1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...
- Ubuntu Linux系统三种方法添加本地软件库
闲着没事教教大家以Ubuntu Linux系统三种方法添加本地软件库,ubuntu Linux使用本地软件包作为安装源——转2007-04-26 19:47新手重新系统的概率很高,每次重装系统后都要经 ...
- maven添加本地jar到本地库中
maven添加本地jar到本地库中(用于远端地址下载不了的情况) 在dos命令行执行以下命令将会吧ojdbc14-10.2.0.4.0.jar添加到本地库中(ps:必须已经安装了,maven,并配置了 ...
- intelliJ IDEA 怎么添加本地的idea web项目
概述:这篇文章主要讲述idea开发工具怎么添加本地的idea web项目. 一:首先介绍一下idea web项目的目录结构: 上图详细简单的说了一下idea web项目的文件情况. 二:说明一下部署本 ...
随机推荐
- Python之函数装饰器
在实际中,我们可能需要在不改变函数源代码和调用方式的情况下,为函数添加一些新的附加功能,能够实现这种功能的函数我们将其称之为装饰器.装饰器本质上其实还是是一个函数,用来装饰其它函数,为函数添加一些附加 ...
- 4-c++教程起航篇-学习笔记
c++教程起航篇 我们会讲C++那些事,C++与C语言的关系. C++诞生于贝尔实验室. C++之父: 本贾尼·斯特劳斯特卢普 C++社区排行榜 最新排行,c++排名第三,Python排名第四 C++ ...
- vue实现图片路径传送
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- 破解Wifi
牛刀小试:Wifi破解的原理. 准备工具: 1:Kali Linux系统 2:一块好用的无线网卡 (推荐免驱版,网上也有推荐,可以去百度上google一下) 3:WPA字典(用来爆破抓获的握手包) ...
- 【8086汇编-Day5】第二次实验
debug的使用 偷个懒,之前写过了这里不再赘述 实验 1)实验1 要求:用e将一些数据写入内存,用a写入一段程序,t 逐条执行 观察具体参数变化,并探究现象 1.e写入,d检查 2.a写入程序 3. ...
- Quartus II 项目文件分类及内容
- 20145209刘一阳 《网络对抗》Exp7 网络欺诈技术防范
20145209刘一阳 <网络对抗>Exp7 网络欺诈技术防范 一.应用SET工具建立冒名网站 要让冒名网站在别的主机上也能看到,需要开启本机的Apache服务,并且要将Apache服务的 ...
- Java:内存泄露和内存溢出
1. 内存溢出 (Memory Overflow) 是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就 ...
- Jsp刷新分页模板,很全
1.用来实现上一页下一页,我直接写到查询页面上 <%--page的分页--%> <style type="text/css"> a { color: # ...
- 使用PowerDesign15反向生成数据库
在Pd15中建立物理模型后,可以通过反向工程直接生成数据库的表结构.主要有以下几个步骤: 1. 首先设置一下数据库配置,选择对应要使用的数据库(此处选择Sql Server 2008 R ...