1

我需要,最好在 C# 中 - 但 C++ 会做,找到一种方法来过滤 Windows 打印对话框中的打印机列表以进行任何 Windows 打印。

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

任何人都可以帮助我完成已经开发的东西或者更简单的方法吗?打印机列表出来的唯一方法是通过 API 方法调用,我什至考虑过修改注册表,但这会减慢打印对话框的响应速度,以至于对用户来说很烦人。

4

2 回答 2

2

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

当然,由于您没有指定任何标准,因此该列表不会像您希望的那样“过滤”。但我相信你可以从这里自己管理。

于 2009-01-12T20:13:54.753 回答
0

感谢您提供有趣的代码。

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

因此,您的 WMI 代码虽然有点酷,但并不合适。如果我正在构建自己的打印对话框,它可以派上用场;)

于 2009-02-10T23:41:50.467 回答