PrintDialog фильтр список принтеров - PullRequest
1 голос
/ 01 октября 2008

Мне нужно, желательно в C #, но в C ++ найдется способ отфильтровать список принтеров в диалоге печати Windows для любой печати Windows.

Я наткнулся на WinAPIOverride и подумал, что мне придется написать свою собственную dll, которая переопределяет метод, чтобы получить список принтеров, затем отфильтровать его и вернуть. Затем мне пришлось бы ввести DLL во все запущенные процессы.

Кто-нибудь может мне помочь с чем-то, что уже разработано или, возможно, более простым способом сделать это? Единственный способ получить список принтеров - это вызов метода API, и я даже подумал об изменении реестра, но это замедлит отклик диалогового окна печати до такой степени, что это будет раздражать пользователя.

Ответы [ 2 ]

2 голосов
/ 12 января 2009

Я не думаю, что (пере) написание DLL - самый простой метод. Почему бы не использовать WMI для извлечения требуемой информации (в данном случае принтеров) ?

Следующий код предназначен для извлечения всех локально установленных принтеров:
(примеры кода заимствованы у здесь )

    ManagementScope objScope = new ManagementScope(ManagementPath.DefaultPath); //For the local Access
    objScope.Connect();

    SelectQuery selectQuery = new SelectQuery();
    selectQuery.QueryString = "Select * from win32_Printer";
    ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
    ManagementObjectCollection MOC = MOS.Get();
    foreach (ManagementObject mo in MOC) {
      listBox1.Items.Add(mo["Name"].ToString().ToUpper());
    }

Чтобы узнать принтеры по всему домену, используйте:

ConnectionOptions objConnection = new ConnectionOptions();
objConnection.Username = "USERNAME";
objConnection.Password = "PASSWORD";
objConnection.Authority = "ntlmdomain:DDI"; //Where DDI is the name of my domain
// Make sure the user you specified have enough permission to access the resource. 

ManagementScope objScope = new ManagementScope(@"\\10.0.0.4\root\cimv2",objConnection); //For the local Access
objScope.Connect();

SelectQuery selectQuery = new SelectQuery();
selectQuery.QueryString = "Select * from win32_Printer";
ManagementObjectSearcher MOS = new ManagementObjectSearcher(objScope, selectQuery);
ManagementObjectCollection MOC = MOS.Get();
foreach (ManagementObject mo in MOC) {
  listBox1.Items.Add(mo["Name"].ToString().ToUpper());
}

Конечно, список не «фильтруется», как хотелось бы, поскольку вы не указали никаких критериев. Но я уверен, что теперь ты сможешь справиться сам.

0 голосов
/ 11 февраля 2009

Спасибо за интересный код.

Идея состоит в том, чтобы применить отфильтрованный список принтеров к системе как можно более глобально, не мешая пользователю. Это означает, что отфильтрованный список, к сожалению, должен применяться к стандартным диалоговым окнам печати Windows ...

Так что ваш код WMI, хоть и крутой, не подходит. Если бы я строил свои собственные диалоговые окна печати, это могло бы пригодиться;)

...