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项目的文件情况. 二:说明一下部署本 ...
随机推荐
- rails应用页面导出为pdf文档
1.下载安装wkhtmltox https://wkhtmltopdf.org/downloads.html 2.gemfile添加 gem 'pdfkit' #页面导出pdf gem 'wkht ...
- arping命令用法
arping命令使用说明 BusyBox v1.17.3 (2011-07-20 17:01:30 CST) multi-call binary. Usage: arping [-fqbDUA] [- ...
- 使用Goland同步远程代码
新版本的goland貌似已经有了Deployment功能,故本篇文章描述的方法也不推荐使用了 以前写php时候习惯使用phpstorm这个编译器,除去本身功能强大不说,比较方便的是其自身带的Deplo ...
- 成都Uber优步司机奖励政策(1月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 佛山Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 4567: [Scoi2016]背单词
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. ...
- Grafana学习
一.安装 Grafana最新版本4.3.1安装(后端使用mysql) 二.使用
- Appium(Python)API
1.创建新的会话desired_caps = desired_caps = { 'platformName': 'Android', 'platformVersion': '7.0', 'dev ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session
第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...
- 【checkbox-group、checkbox】 多项选择器组件说明
checkbox-group组件包裹checkbox组件的容器 原型: <check-group bindchange="[EventHandle]"> <che ...