65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (23投票s)

2004年4月2日

2分钟阅读

viewsIcon

261342

downloadIcon

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;
}

就是这样!

许可证

本文没有明确的许可证附加到它,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论板联系作者。可以在 这里 找到作者可能使用的许可证列表。

© . All rights reserved.