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#添加本地打印机的更多相关文章

  1. AD组策略添加本地账号、设置允许ping回显

    AD组策略添加本地账号 1. 管理工具--组策略管理--选择相应GPO(编辑)----首选项--控制面板设置--本地用户和组--右键添加账号 2.域成员计算机刷新组策略(gpupdate/force) ...

  2. maven添加本地jar包

    今天遇到一个mavan仓库中没有的jar包, 故只能添加本地jar包, 花了不少时间找资料,终于OK.故在此记录. 1. 第一次,在网上看到说可以用<systemPath> 解决, 如下: ...

  3. Sql server之路 (三)添加本地数据库SDF文件

    12月25日 今天搞了半天 添加本地数据库Sdf文件到项目里.总是出现问题. 安装环境 Vs2008 没有安装的环境 1.Vs2008 sp1 2. 适用于 Windows 桌面的 Microsoft ...

  4. [原]逆向iOS SDK -- “添加本地通知”的流程分析

    观点: 代码面前没有秘密 添加通知的 Demo 代码 - (void)scheduleOneLocalNotification { [[UIApplication sharedApplication] ...

  5. maven添加本地依赖包方法

    1.某些情况下不方便上传本地依赖包到Maven repository,可以通过下面方法添加本地依赖包. 2.方法 1).pom.xml中添加以下代码块 <dependency> <g ...

  6. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  7. Ubuntu Linux系统三种方法添加本地软件库

    闲着没事教教大家以Ubuntu Linux系统三种方法添加本地软件库,ubuntu Linux使用本地软件包作为安装源——转2007-04-26 19:47新手重新系统的概率很高,每次重装系统后都要经 ...

  8. maven添加本地jar到本地库中

    maven添加本地jar到本地库中(用于远端地址下载不了的情况) 在dos命令行执行以下命令将会吧ojdbc14-10.2.0.4.0.jar添加到本地库中(ps:必须已经安装了,maven,并配置了 ...

  9. intelliJ IDEA 怎么添加本地的idea web项目

    概述:这篇文章主要讲述idea开发工具怎么添加本地的idea web项目. 一:首先介绍一下idea web项目的目录结构: 上图详细简单的说了一下idea web项目的文件情况. 二:说明一下部署本 ...

随机推荐

  1. Python学习手册之 Python 之禅、Python 编程规范和函数参数

    在上一篇文章中,我们介绍了 Python 的正则表达式使用示例,现在我们介绍 Python 之禅. Python 编程规范和函数参数.查看上一篇文章请点击:https://www.cnblogs.co ...

  2. HMM笔记

    参考资料: 1.https://www.bilibili.com/video/av24132174/?p=4 2.<数学之美>-吴军 3.<统计学习方法>-李航 HMM(Hid ...

  3. 串口UART学习笔记(一)

    买了一个开发板学习FPGA,找到的各种东西就记录在这个博客里了,同时也方便把自己不会的问题找到的结果记录一下,都是自己手打,所以可能说的话不那么严谨,不那么精准,看到的人要带着自己的思考去看,记住尽信 ...

  4. HDOJ:6356-Glad You Came(线段树剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356 解题心得: 现在深深的知道了算法复杂度的重要了,这个题算复杂度的时候还要把一些常数也算出来,不然 ...

  5. [原创]利用python发送伪造的ARP请求

    #!/usr/bin/env python import socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) s.bind((&qu ...

  6. Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)

    设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...

  7. python通过mongoengine中connect函数连接多个数据库

    mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可. 可以通过switch_db切换到不同的数据库,进行读写操作,swi ...

  8. nodeJs 安装 npm nodeModules package.json

    Nodejs   1.安装nodejs 从nodejs官网下载最新版本的node,设置环境变量这样就可以在cmd下直接用命令行操作npm 环境变量:path  d:/nodejs 查看本机node及n ...

  9. Awesome Django

     Awesome Django    If you find Awesome Django useful, please consider donating to help maintain it. ...

  10. define的误用

    #define LIGHT_SPEED 3e8 // m/sec (in a vacuum)