在.NET中设置打印机“保留打印文档”属性

时间:2012-08-24 13:06:56

标签: c# .net printing wmi

以下是我们要做的事情:

我们希望采用一种不显眼的方式将客户打印在计算机上的所有内容(我们所有的客户都运行POS系统并专门使用Windows XP)并将其发送给我们,我们决定最好的方法是创建ac#app,向我们发送他们的假脱机文件,我们已经可以轻松解析了。

但是,这需要将“保留所有打印文档”设置为true。我们希望在我们的应用程序中而不是手动执行此操作,原因如下:由于缺少更好的词,我们的一些(数百)客户是愚蠢的。我们不想强迫他们在控制面板中乱七八糟......我们的技术支持人员非常忙碌。

这是我遇到问题的地方:

string searchQuery = "SELECT * FROM Win32_Printer";
ManagementObjectSearcher searchPrinters = new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection printerCollection = searchPrinters.Get();


foreach (ManagementObject printer in printerCollection)
{
    PropertyDataCollection printerProperties = printer.Properties;
    foreach (PropertyData property in printerProperties)
    {
        if (property.Name == "KeepPrintedJobs")
        {
            printerProperties[property.Name].Value = true;
        }
    }
}

据我所知,从几个小时的WMI研究中可以看出,将每台打印机的KeepPrintedJobs属性设置为true ...但它不起作用。 foreach循环结束后,KeepPrintedJobs将重新设置为false。我们更喜欢使用WMI而不是在注册表中乱七八糟,但我不能花费太多时间来尝试使这项工作。关于什么缺失的任何想法?

1 个答案:

答案 0 :(得分:3)

尝试在Put()上添加对ManagementObject的调用以明确保留更改,如下所示:

foreach (ManagementObject printer in printerCollection)
{
    PropertyDataCollection printerProperties = printer.Properties;
    foreach (PropertyData property in printerProperties)
    {
        if (property.Name == "KeepPrintedJobs")
        {
            printerProperties[property.Name].Value = true;
        }
    }
    printer.Put();
}

希望有所帮助。