一种使用 WMI 控制打印作业的简单方法






4.62/5 (23投票s)
2004年4月2日
2分钟阅读

261342

1
一种使用 WMI 控制打印作业的简单方法。
引言
本文介绍了一种使用 WMI 控制打印作业的简化方法。要了解更多关于 WMI 的信息,请访问 MSDN。
为什么选择 WMI?因为它提供了一种简化的方法,避免在我们的 C# 代码中进行 API 调用。WMI 是 Windows XP 和 Windows 2000 的默认组件。对于 Windows 95/98,我们需要下载 WMI Core 1.5 并安装它:WMI Core 1.5
方法
首先,让我们看看如何获取打印机列表。
public static StringCollection GetPrintersCollection()
{
StringCollection printerNameCollection = new StringCollection();
string searchQuery = "SELECT * FROM Win32_Printer";
ManagementObjectSearcher searchPrinters =
new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection printerCollection = searchPrinters.Get();
foreach(ManagementObject printer in printerCollection)
{
printerNameCollection.Add(printer.Properties["Name"].Value.ToString());
}
return printerNameCollection;
}
上述方法返回本地机器上配置的打印机列表。打印机 ManagementObject
暴露了许多有用的属性。使用 PaperSizesSupported
属性,我们可以获取该特定打印机支持的纸张尺寸列表。要查看关于 Win32_Printer
的信息,请参考 MSDN。
使用此打印机名称,我们可以使用以下方法获取打印作业集合
public static StringCollection GetPrintJobsCollection(string printerName)
{
StringCollection printJobCollection = new StringCollection();
string searchQuery = "SELECT * FROM Win32_PrintJob";
/*searchQuery can also be mentioned with where Attribute,
but this is not working in Windows 2000 / ME / 98 machines
and throws Invalid query error*/
ManagementObjectSearcher searchPrintJobs =
new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
foreach(ManagementObject prntJob in prntJobCollection)
{
System.String jobName = prntJob.Properties["Name"].Value.ToString();
//Job name would be of the format [Printer name], [Job ID]
char[] splitArr = new char[1];
splitArr[0] = Convert.ToChar(",");
string prnterName = jobName.Split(splitArr)[0];
string documentName = prntJob.Properties["Document"].Value.ToString();
if(String.Compare(prnterName, printerName, true) == 0)
{
printJobCollection.Add(documentName);
}
}
return printJobCollection;
}
查询 "SELECT * FROM Win32_PrintJob
" 也可以用作 "SELECT * FROM Win32_PrintJob WHERE Name like '"+ printerName.Replace("\", "\\") +"%'"
。但是,带有 WHICH
属性的查询在我的运行 Windows 2000 的系统上导致了问题,但在 Windows XP 机器上运行顺畅。所以目前,我正在遍历所有打印作业,并识别该特定打印机的打印作业。
现在,让我们看看如何管理这些打印作业。Windows 提供的打印控制台允许我们暂停、恢复和取消打印作业。它还允许为打印作业设置优先级。使用 WMI,我们可以执行暂停、恢复和取消操作,但它不提供任何更改优先级级别的方法。
以下代码演示了如何暂停打印作业
public static bool PausePrintJob(string printerName, int printJobID)
{
bool isActionPerformed = false;
string searchQuery = "SELECT * FROM Win32_PrintJob";
ManagementObjectSearcher searchPrintJobs =
new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
foreach(ManagementObject prntJob in prntJobCollection)
{
System.String jobName = prntJob.Properties["Name"].Value.ToString();
//Job name would be of the format [Printer name], [Job ID]
char[] splitArr = new char[1];
splitArr[0] = Convert.ToChar(",");
string prnterName = jobName.Split(splitArr)[0];
int prntJobID = Convert.ToInt32(jobName.Split(splitArr)[1]);
string documentName = prntJob.Properties["Document"].Value.ToString();
if(String.Compare(prnterName, printerName, true) == 0)
{
if(prntJobID == printJobID)
{
prntJob.InvokeMethod("Pause", null);
isActionPerformed = true;
break;
}
}
}
return isActionPerformed;
}
通过调用 Pause
方法,我们可以暂停打印作业。恢复打印作业需要类似的方法。我们只需要调用 Resume
方法。
prntJob.InvokeMethod("Resume", null);
Win32_PrintJob WMI_CLASS
提供了暂停和恢复打印作业的方法。但是,它没有提供任何用于取消打印作业的方法。要取消打印作业,您只需要删除管理对象。
public static bool CancelPrintJob(string printerName, int printJobID)
{
bool isActionPerformed = false;
string searchQuery = "SELECT * FROM Win32_PrintJob";
ManagementObjectSearcher searchPrintJobs =
new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
foreach(ManagementObject prntJob in prntJobCollection)
{
System.String jobName = prntJob.Properties["Name"].Value.ToString();
//Job name would be of the format [Printer name], [Job ID]
char[] splitArr = new char[1];
splitArr[0] = Convert.ToChar(",");
string prnterName = jobName.Split(splitArr)[0];
int prntJobID = Convert.ToInt32(jobName.Split(splitArr)[1]);
string documentName = prntJob.Properties["Document"].Value.ToString();
if(String.Compare(prnterName, printerName, true) == 0)
{
if(prntJobID == printJobID)
{
//performs a action similar to the cancel
//operation of windows print console
prntJob.Delete();
isActionPerformed = true;
break;
}
}
}
return isActionPerformed;
}
就是这样!
许可证
本文没有明确的许可证附加到它,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论板联系作者。可以在 这里 找到作者可能使用的许可证列表。