打印机的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代码虽然很酷,但却不合适。如果我要建立自己的打印对话框,它可能会派上用场;)