打印机的PrintDialog过滤器列表

时间:2020-03-06 14:59:26  来源:igfitidea点击:

我需要,最好是在Cbut c ++中,我需要找到一种方法来过滤所有Windows打印的Windows打印对话框中的打印机列表。

我遇到了WinAPIOverride,并发现我将不得不编写自己的dll,该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.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());
}

当然,由于我们没有指定任何条件,因此列表不会像我们希望的那样被"过滤"。但是我敢肯定,我们可以自己从这里开始进行管理。

感谢我们提供有趣的代码。

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

因此,WMI代码虽然很酷,但却不合适。如果我要建立自己的打印对话框,它可能会派上用场;)