【问题标题】:PrintDialog filter list of printersPrintDialog 过滤器列表
【发布时间】:2008-10-01 18:24:27
【问题描述】:
我需要,最好在 C# 中 - 但 c++ 会这样做,找到一种方法来过滤 Windows 打印对话框中的打印机列表以进行任何 Windows 打印。
我遇到了 WinAPIOverride 并认为我将不得不编写自己的 dll 来覆盖获取打印机列表的方法,然后对其进行过滤并返回它。然后我必须将 dll 注入所有正在运行的进程中。
任何人都可以帮助我完成一些已经开发的或者更简单的方法吗?打印机列表出来的唯一方法是通过 API 方法调用,我什至考虑过修改注册表,但这会减慢打印对话框的响应速度,以至于让用户感到厌烦。
【问题讨论】:
标签:
winapi
filter
printdialog
【解决方案1】:
我不认为(重新)编写 DLL 是最简单的方法。为什么不使用WMI 来检索想要的information (printers in this case)?
以下代码用于检索所有本地安装的打印机:
(代码示例借自here)
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());
}
当然,由于您没有指定任何条件,因此该列表不会像您希望的那样“过滤”。但我相信你可以从这里自己管理。
【解决方案2】:
感谢有趣的代码。
我们的想法是在不干扰用户的情况下尽可能全局地将过滤后的打印机列表应用于系统。这意味着过滤后的列表必须适用于标准的 windows 打印对话框......
因此,您的 WMI 代码虽然有点酷,但并不合适。如果我正在构建自己的打印对话框,它会派上用场;)