原文:.Net中获取打印机的相关信息

新项目中牵涉到对打印机的一些操作,最重要的莫过于获取打印机的状态,IP等信息,代码量不大,但是也是自己花了一点时间总结出来的,希望能帮助需要的朋友。

PrinterCommunicate用于连接打印机并发送指令

 1     public class PrinterCommunicate
{ public bool CheckNetWorkConnection(string strPrinterIP, int intPrinterPort)
{
System.Net.Sockets.TcpClient Zebraclient = new TcpClient();
try
{
Zebraclient.Connect(strPrinterIP, intPrinterPort);
return Zebraclient.Connected;
}
catch
{
return false;
}
} public bool SendZPL_ViaNetwork(string strPrinterIP, int intPrinterPort, string strPrinterCommand, out string strOutMsg)
{
strOutMsg = ""; System.Net.Sockets.TcpClient Zebraclient = new TcpClient();
try
{
Zebraclient.SendTimeout = ;
Zebraclient.ReceiveTimeout = ;
//defining ip address and port number
Zebraclient.Connect(strPrinterIP, intPrinterPort); if (Zebraclient.Connected == true)
{
//send and receive illustrated below
NetworkStream mynetworkstream;
StreamReader mystreamreader;
StreamWriter mystreamwriter;
mynetworkstream = Zebraclient.GetStream();
mystreamreader = new StreamReader(mynetworkstream);
mystreamwriter = new StreamWriter(mynetworkstream); mystreamwriter.WriteLine(strPrinterCommand);
mystreamwriter.Flush();
char[] mk = null;
mk = new char[];
mystreamreader.Read(mk, , mk.Length);
string data1 = new string(mk);
strOutMsg = data1;
Zebraclient.Close(); return true;
}
else
{
strOutMsg = "Connection failed";
return false;
}
}
catch (Exception ex)
{
Log.WriteLogToFile("IPP_PCL", "PrinterCommunicate.cs -- SendZPL_ViaNetwork", "-99", ex.Message);
strOutMsg = "EXCEPTION_ERROR";
} return false;
} }

WindowsPrintQueue用于获取打印机的型号,以及得到打印机的WindowsPrintQueue

     public class WindowsPrintQueue
{
/// <summary>
/// whether the two printer is same model.
/// </summary>
/// <param name="printerName1"></param>
/// <param name="printerName2"></param>
/// <returns></returns>
public bool IsSameModel(string printerName1, string printerName2)
{
return GetPrinterModel(printerName1).Equals(GetPrinterModel(printerName2));
} /// <summary>
/// whether the printer is zebra model.
/// </summary>
/// <param name="printerName1"></param>
/// <param name="printerName2"></param>
/// <returns></returns>
public bool IsZebraPrinter(string printerName)
{
string zebraModel = "ZEBRA";
return GetPrinterModel(printerName).Contains(zebraModel);
} /// <summary>
/// Return printer model
/// </summary>
/// <param name="printerName"></param>
/// <returns></returns>
public string GetPrinterModel(string printerName)
{
string model = string.Empty;
System.Printing.PrintQueue printQueue = GetPrintQueue(printerName);
if (printQueue != null)
{
//Get printer model
if (printQueue.Description.IndexOf(",") == printQueue.Description.LastIndexOf(","))
{
model = printQueue.Description.Substring(printQueue.Description.IndexOf(",") + ,
printQueue.Description.LastIndexOf(",") - printQueue.Description.IndexOf(",") - );
}
else
{
model = printQueue.Description.Substring(printQueue.Description.IndexOf(",") + );
}
}
return model;
} /// <summary>
/// Get Windows Print Queue via printer name
/// </summary>
/// <param name="printerName"></param>
/// <returns></returns>
public System.Printing.PrintQueue GetPrintQueue(string printerName)
{
System.Printing.PrintQueue printQueue = null;
PrintServer server = new PrintServer(printerName);
foreach (System.Printing.PrintQueue pq in server.GetPrintQueues())
{
if (pq.FullName.Equals(printerName))
{
printQueue = pq;
}
}
return printQueue;
} /// <summary>
/// Get Windows Print Queue via printer name
/// 如果两个printer指向的是同一个物理打印机,则如果copy1的printQueue已经打开,
///则发送到copy2的打印job也会添加到已经打开的copy1的printQueue中.
/// </summary>
/// <param name="printerName"></param>
/// <returns></returns>
public System.Printing.PrintQueue GetOpenedPrintQueueOfSameModel(string printerName)
{
System.Printing.PrintQueue doorOpenedprintQueue = null;
System.Printing.PrintQueue currentPrinterPrintQueue = null;
PrintServer server = new PrintServer(printerName);
foreach (System.Printing.PrintQueue pq in server.GetPrintQueues())
{
if (pq.FullName.Equals(printerName))
{
currentPrinterPrintQueue = pq;
}
else
{
if (IsSameModel(printerName, pq.FullName))
{
if (pq.IsDoorOpened)
{
doorOpenedprintQueue = pq;
break;
}
}
}
} if (doorOpenedprintQueue != null)
{
return doorOpenedprintQueue;
}
else
{
return currentPrinterPrintQueue;
}
}
}

PrinterPropertyManager用于管理打印机的状态以及查询修改打印机属性

     class PrinterPropertyManager
2 {
/// <summary>
/// 获取打印机的IP地址和端口号
/// </summary>
/// <param name="printerName">打印机名称</param>
public KeyValuePair<string, int> GetPrinterIPAndPort(string printerName)
{
string port = GetPrinterPropertyValue(printerName, "PortName");
//Query portName's property from regedit
string[] portQuerys = GetPortQuerys(port);
foreach (var portQuery in portQuerys)
{
RegistryKey portKey = Registry.LocalMachine.OpenSubKey(portQuery, RegistryKeyPermissionCheck.Default,
System.Security.AccessControl.RegistryRights.QueryValues);
if (portKey != null)
{
object IPValue = portKey.GetValue("IPAddress", String.Empty,
RegistryValueOptions.DoNotExpandEnvironmentNames);
object portValue = portKey.GetValue("PortNumber", String.Empty,
RegistryValueOptions.DoNotExpandEnvironmentNames);
if (IPValue != null && portValue != null)
{
return new KeyValuePair<string, int>(IPValue.ToString(), (Int32)portValue);
}
}
}
return new KeyValuePair<string, int>();
} /// <summary>
/// determine whether the printer is network printer.
/// </summary>
public bool IsNetWorkPrinter(string printer)
{
string port = GetPrinterPropertyValue(printer, "PortName");
//Query portName's property from regedit
string[] portQuerys = GetNetWorkPortQuerys(port);
foreach (var portQuery in portQuerys)
{
RegistryKey portKey = Registry.LocalMachine.OpenSubKey(portQuery, RegistryKeyPermissionCheck.Default,
System.Security.AccessControl.RegistryRights.QueryValues);
if (portKey != null)
{
return true;
}
}
return false;
} private string[] GetNetWorkPortQuerys(string portName)
{
return new string[]
{
@"System\CurrentControlSet\Control\Print\Monitors\Advanced Port Monitor\Ports\" + portName,
@"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + portName
};
} private string[] GetPortQuerys(string portName)
{
return new string[]
{
@"System\CurrentControlSet\Control\Print\Monitors\Advanced Port Monitor\Ports\" + portName,
@"System\CurrentControlSet\Control\Print\Monitors\Local Port\Ports\" + portName,
@"System\CurrentControlSet\Control\Print\Monitors\Standard TCP/IP Port\Ports\" + portName,
@"System\CurrentControlSet\Control\Print\Monitors\USB Monitor\Ports\" + portName,
@"System\CurrentControlSet\Control\Print\Monitors\WSD Port\Ports\" + portName,
};
} /// <summary>
/// get printer property value
/// </summary>
public string GetPrinterPropertyValue(string printerName, string propertyName)
{ string propertyValue = string.Empty;
//Query printer's portName from WIN32_Printer
string query = string.Format("SELECT * from Win32_Printer WHERE Name = '{0}'", printerName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection managementObjects = searcher.Get();
foreach (ManagementObject managementObject in managementObjects)
{
PropertyData propertyData = managementObject.Properties[propertyName];
if (propertyData != null)
{
propertyValue = propertyData.Value.ToString();
}
}
return propertyValue;
} /// <summary>
/// change printer property value
/// </summary>
public void SetPrinterPropertyValue(string printerName, string propertyName, string propertyValue)
{ //Query printer's portName from WIN32_Printer
string query = string.Format("SELECT * from Win32_Printer WHERE Name = '{0}'", printerName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection managementObjects = searcher.Get();
foreach (ManagementObject managementObject in managementObjects)
{
PropertyData propertyData = managementObject.Properties[propertyName];
if (propertyData != null)
{
propertyData.Value = propertyValue;
managementObject.Put();
}
}
}

 /// <summary>
        /// whether the port is existed
/// 检查某个打印端口是否存在
        /// </summary>
        /// <param name="printerName"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        public bool IsPortExisted(string printerName,string port)
        {
            string propertyName = "PortName";
            string currentPort = null;
            try
            {
                currentPort = GetPrinterPropertyValue(printerName, propertyName);
                SetPrinterPropertyValue(printerName, propertyName, port);
                SetPrinterPropertyValue(printerName, propertyName, currentPort);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        } /// <summary>
/// 获取打印机名字的列表
/// </summary>
public ArrayList GetPrinterNames()
{
ArrayList result = new ArrayList(); foreach (string ss in PrinterSettings.InstalledPrinters)
{
result.Add(ss);
}
return result;
} /// <summary>
/// 获取打印机状态
/// </summary>
/// <param name="printerName">打印机名称</param>
public PrinterStatus GetPrinterStatus(string printerName,out bool isError,out string errorDescription)
{
//init return variable
isError = false;
errorDescription = string.Empty;
PrinterStatus printerStatus = PrinterStatus.Idle;
if (IsNetWorkPrinter(printerName))
{
KeyValuePair<string, int> ipPortKeyValuePair = GetPrinterIPAndPort(printerName);
PrinterCommunicate printerCommunicate = new PrinterCommunicate();
if (printerCommunicate.CheckNetWorkConnection(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value))
{
WindowsPrintQueue winowsPrintQueue = new WindowsPrintQueue();
if (winowsPrintQueue.IsZebraPrinter(printerName))
{
//get actual status of zebra printer via zebra command
if(IsPause(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value))
{
printerStatus = PrinterStatus.Paused;
} string errorMsg = string.Empty;
if(IsError(ipPortKeyValuePair.Key, ipPortKeyValuePair.Value, out errorMsg))
{
isError = true;
errorDescription = GetZebraPrinterErrorStatusDescription(errorMsg);
}
}
}
else
{
//not connected
printerStatus = PrinterStatus.Offline;
}
}
return printerStatus;
} /// <summary>
/// determine whether the network printer is in pause.Only for zebra model printer
/// </summary>
private bool IsPause(string ip, int port)
{
string strOutMsg = null;
string zebraCommand = "^XA~HS^XZ";
PrinterCommunicate printerCommunicate = new PrinterCommunicate();
if (printerCommunicate.SendZPL_ViaNetwork(ip, port, zebraCommand, out strOutMsg))
{
//split retMsg with "\r\n"
string[] retMsgs = strOutMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
if (retMsgs != null)
{
string retFirstMsgItem = retMsgs[];
string[] retFirstMsgItems = retFirstMsgItem.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
return "".Equals(retFirstMsgItems[]);
}
}
return false;
} /// <summary>
/// determine whether the network printer is in error.only for zebra model printer
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <param name="strOutMsg"></param>
/// <returns></returns>
private bool IsError(string ip, int port, out string strOutMsg)
{
strOutMsg = string.Empty;
string zebraCommand = "^XA~HQES^XZ";
PrinterCommunicate printerCommunicate = new PrinterCommunicate();
if (printerCommunicate.SendZPL_ViaNetwork(ip, port, zebraCommand, out strOutMsg))
{
//split retMsg with "\r\n"
string[] retMsgs = strOutMsg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
if (retMsgs != null)
{
for (int i = ; i < retMsgs.Length; i++)
{
string retMsgItem = retMsgs[i];
if (string.IsNullOrEmpty(retMsgItem) || !retMsgItem.Contains(":")) { continue; } string[] retMsgItemSplited = retMsgItem.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
if (retMsgItemSplited == null || retMsgItemSplited.Length == ) { continue; } string errorMsg = retMsgItemSplited[].Trim();
if (!string.IsNullOrEmpty(errorMsg))
{
string errorFlag = errorMsg.Substring(, );
if ("".Equals(errorFlag))
{
strOutMsg = errorMsg;
return true;
}
}
}
}
}
return false;
} /// <summary>
/// get actual status of zebra printer via zebra command.
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns></returns>
private string GetZebraPrinterErrorStatusDescription(string errorMsg)
{
StringBuilder status = new StringBuilder();
//error happend
string nibble1 = errorMsg.Substring(errorMsg.Length - , );
string nibble2 = errorMsg.Substring(errorMsg.Length - , );
string nibble3 = errorMsg.Substring(errorMsg.Length - , ); if (!"".Equals(nibble1))
{
Dictionary<int, string> nibble1ErrorDictionary = new Dictionary<int, string>();
nibble1ErrorDictionary.Add(, "Midea Out");
nibble1ErrorDictionary.Add(, "Ribbon Out");
nibble1ErrorDictionary.Add(, "Head Open");
nibble1ErrorDictionary.Add(, "Cutter Fault"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble1ErrorDictionary));
} if (!"".Equals(nibble2))
{
Dictionary<int, string> nibble2ErrorDictionary = new Dictionary<int, string>();
nibble2ErrorDictionary.Add(, "Printhead Over Temperature");
nibble2ErrorDictionary.Add(, "Motor Over Temperature");
nibble2ErrorDictionary.Add(, "Bad Printhead Element");
nibble2ErrorDictionary.Add(, "Printhead Detection Error"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble2ErrorDictionary));
} if (!"".Equals(nibble3))
{
Dictionary<int, string> nibble3ErrorDictionary = new Dictionary<int, string>();
nibble3ErrorDictionary.Add(, "Invalid Firmware Config");
nibble3ErrorDictionary.Add(, "Printhead Thermistor Open"); status.Append(GetErrorDescriptionFromNibble(nibble1, nibble3ErrorDictionary));
} string strStatus = status.ToString();
return strStatus.Substring(, strStatus.Length - );
} private StringBuilder GetErrorDescriptionFromNibble(string nibble, Dictionary<int, string> statusDictionary)
{
int intNibble = Convert.ToInt32(nibble);
StringBuilder status = new StringBuilder();
if (statusDictionary != null)
{
foreach (var statusKV in statusDictionary)
{
if ((intNibble & statusKV.Key) == statusKV.Key)
{
status.Append(statusKV.Value);
status.Append(",");
}
}
}
return status;
}
} public enum PrinterStatus
{
Other = ,
Unknown = ,
Idle = ,
Printing = ,
Warmup = ,
Paused = ,
Offline =
}

.Net中获取打印机的相关信息的更多相关文章

  1. Java Web应用中获取用户请求相关信息,如:IP地址、操作系统、浏览器等信息

    引入jar包 <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUti ...

  2. SAP中获取当前用户相关信息的两个函数

    函数名:TH_USER_LIST作用:可以得到SM04界面显示样式的表. 函数名:TH_USER_INFO作用:可以得到当前特定用户的机器名.当前活动窗口数.IP地址等信息

  3. $_SERVER['HTTP_USER_AGENT']:在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息

    在PHP中HTTP_USER_AGENT是用来获取用户的相关信息的,包括用户使用的浏览器,操作系统等信息. 我机器:操作系统:WIN7旗舰版 64操作系统 以下为各个浏览器下$_SERVER['HTT ...

  4. Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息

    详情请看:Cordova各个插件使用介绍系列(六)—$cordovaDevice获取设备的相关信息 在项目中需要获取到当前设备,例如手机的ID,联网状态,等,然后这个Cordova里有这个插件可以用, ...

  5. 获取Java系统相关信息

    package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...

  6. C#获取电脑的相关信息

    /* 创建者:菜刀居士的博客  * 创建日期: 2014年08月31号  * 功能:获取电脑的相关信息  *  */ namespace Net.String.ConsoleApplication { ...

  7. 通过request对象获取客户端的相关信息

    通过request对象获取客户端的相关信息 制作人:全心全意 通过request对象可以获取客户端的相关信息.例如HTTP报头信息.客户信息提交方式.客户端主机IP地址.端口号等等. request获 ...

  8. NX二次开发-UF_ASSEM_ask_component_data获取装配部件的相关信息

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_assem.h> ], void* user_ ...

  9. MSSQL·查询数据库中所有索引的相关信息

    阅文时长 | 0.45分钟 字数统计 | 784字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询数据库中所有索引的相关信息』 编写人 | SCscHero 编写时间 ...

随机推荐

  1. Wamp 访问本地站点慢 的解决办法

    自从安装了64位的windows 8.1之后,电脑运行速度变快了,可是重新下载安装64位的WAMP,访问本地的WEB站点确是很慢,根本不像是在本地访问,经过在WAMP论坛上搜索,终于找到了解决办法,主 ...

  2. 浅谈 PHP 变量可用字符

    原文:浅谈 PHP 变量可用字符 先来说说php变量的命名规则,百度下一抓一大把:(1) PHP的变量名区分大小写;(2) 变量名必须以美元符号$开始;(3) 变量名开头可以以下划线开始;(4) 变量 ...

  3. iOS文件保存策略

    Where You Should Put Your App’s Files To prevent the syncing and backup processes on iOS devices fro ...

  4. HDU 5071 Chat

    题意: CLJ找了很多妹子-  (题目好没节操-)  对于CLJ和妹子的聊天对话框  有一下几种操作: add  加一个妹子在聊天窗队列末尾  假设这个妹子已经在队列中则add失败 close  关掉 ...

  5. JDBC/XML的一些基本使用

    原文:JDBC/XML的一些基本使用 一.知识点题目:JDBC核心API的使用 关键字:JDBC核心API 内容: 1)加载JDBC驱动: Oracle:Class.forName(“oracle.j ...

  6. codefroce D. Powerful array[初识块状数组]

    codefroce D. Powerful array[初识块状数组] 由于是初始所以,仅仅能先用别人的分析.囧... 题目: 给定一个数列:A1, A2,--,An,定义Ks为区间(l,r)中s出现 ...

  7. Javascript异步数据的同步处理方法

    数据处理方法封装 var DataWatch=(function(){ var gWatch={},cursor= 0,callback_key = 'callback',gMap={}; var c ...

  8. GEF的MVC体系结构

    摘要: 本文首先介绍了标准的 MVC 体系构架,同时也介绍了最常见的一类 MVC 模式的变种.之后,文章重点介绍了 MVC 结构在 gef 框架中的体现与应用,以及 gef 是如何综合利用工厂模式.命 ...

  9. Python重写C语言程序100例--Part6

    ''' [程序41] 题目:学习static定义静态变量的使用方法 1.程序分析: 2.程序源码: ''' # python没有这个功能了,仅仅能这样了:) def varfunc(): var = ...

  10. Android 访问Android Wear数据层Api——同步Data Items

    Data Items它被用来同步手机和wear数据接口,一个Date Items通常包含以下几个部分: Payload 字节数组.无论你需要设置数据类型,我们同意对象序列化和反序列化,大小不能超过10 ...