打印机的PrintDialog筛选器列表



我需要找到一种方法来过滤windows打印对话框中的打印机列表,最好是在C#中,但C++会这样做。

我遇到了WinAPIOverride,并认为我将不得不编写自己的dll,它将覆盖获取打印机列表的方法,然后对其进行筛选并返回。然后,我必须将dll注入所有正在运行的进程。

有人能帮助我做一些已经开发出来的事情吗?或者用一种更容易的方式来实现这一点吗?打印机列表的唯一方法是从API方法调用中获取,我甚至考虑过修改注册表,但这会降低打印对话框的响应速度,从而使用户感到厌烦。

我不认为(重新)编写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.4rootcimv2",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());
}

当然,由于您没有指定任何条件,因此列表不会按照您的意愿进行"筛选"。但我相信从现在起你可以自己应付。

感谢您提供的有趣的代码。

其想法是在不干扰用户的情况下,尽可能全局地将过滤后的打印机列表应用于系统。不幸的是,这意味着过滤列表必须应用于标准的windows打印对话框。。。

因此,您的WMI代码虽然有点酷,但并不合适。如果我正在构建自己的打印对话框,它可能会非常方便;)

相关内容

  • 没有找到相关文章

最新更新