Мне нужно, чтобы все локальные принтеры исключили все перенаправленные принтеры и факсимильные аппараты. В настоящее время я жестко кодирую значения, как показано ниже. Есть ли правильный способ для реализации этого?
Я использовал реестр win32 для получения всех принтеров и хранения простого строкового массива (исключая принтеры), чтобы проверить, содержат ли эти имена идентифицированные принтеры. Если так, я просто отфильтрую их.
using Microsoft.Win32;
private readonly RegistryKey baseRegistryKey = Registry.LocalMachine;
private readonly string pathOfPrintersSubkey = "SYSTEM\\CurrentControlSet\\Control\\Print\\Printers\\";
public Dictionary<string, Dictionary<string, string>> GetAllPrinters()
{
using (RegistryKey registrykey = baseRegistryKey.OpenSubKey(pathOfPrintersSubkey))
{
var printers = new Dictionary<string, Dictionary<string, string>>();
if (registrykey == null) return printers;
var valueNames = registrykey.GetSubKeyNames();
//get atributes of each printer
foreach (string printerName in valueNames)
{
string pathToPrinter = string.Concat(pathOfPrintersSubkey, printerName);
using (var printerRegistrykey = baseRegistryKey.OpenSubKey(pathToPrinter + "\\"))
{
var printerAtributes = new Dictionary<string, string>();
if (printerRegistrykey != null)
{
var atributes = printerRegistrykey.GetValueNames();
foreach (string atributeKey in atributes)
{
string printerAtributeValue = printerRegistrykey.GetValue(atributeKey).ToString();
printerAtributes.Add(atributeKey, printerAtributeValue);
}
}
printers.Add(printerName, printerAtributes);
}
}
return printers;
}
}
public static readonly string[] excludePrinters =
{
"send to onenote ",
"microsoft xps document writer",
"fax",
"microsoft print to pdf",
"(redirected "
};
public static bool IsExcludedPrinter(string printerName)
{
return excludePrinters.Any(printerName.ToLowerInvariant().Contains) ? true : false;
}
var allPrinters = GetAllPrinters();
foreach (string printer in printersFromRegistery.Keys.ToList())
if (IsExcludedPrinter(printer))
printersFromRegistery.Remove(printer);
var filterdPrinters = printersFromRegistery;
return filterdPrinters;