如何在Windows中控制打印机的打印机纸盘选择
我们需要能够更改给定打印机的默认选定打印纸盘。有没有人这样做的VC ++ / win32代码?
万一有问题,我相信我们必须更改打印机的默认设置。我们的打印作业是由非我们的应用程序执行的,因此我们不能在源自我们应用程序内部的打印操作的上下文中进行此类更改。除非有某种方法可以在其他应用程序中修改默认打印设置,否则我认为我们将无法更改打印机的用户默认设置,启动我们的打印作业,然后将默认设置恢复为原始值。
我们真的希望只为当前用户更改默认设置,而不需要任何特殊的UAC海拔等等。
我怀疑它会使用类似于此MSDN文章中显示的内容,并涉及在DEVMODE结构中设置字段(dmDefaultSource或者dmFormName或者两者)。
有没有人?还是有人想分享任何陷阱?
编辑:这是DEVMODE文档的链接DEVMODE文档
编辑:我还应该指出,我们正在寻找一种通用解决方案,而不是特定于特定打印机的解决方案(我们在许多环境中部署)
解决方案
最近,我必须在特定的打印机驱动程序上执行非常相似的操作,并且它需要特定于供应商的SDK。托盘似乎没有出现在DEVMODE或者任何其他PRINTINFO_ *结构中,所以我想我会把一封电子邮件发送给打印机供应商。
作为最后的选择,我可以想到两种可能的破解方法。一种是使用脚本工具(例如AutoIT)在GUI级别上自动化驱动程序。第二个是将注册表转储到文件,更改驱动程序设置,再次转储注册表,然后比较差异(可能会或者可能不会)。
据我所知,打印机通过发送SNMP或者PJL命令由打印机驱动程序控制。但是,并非所有打印机都完全实现这些命令集。
对于HP打印机,我可以在以下位置找到:http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?lang=zh-CN&cc=us&objectID=bpl07282&jumpid=reg_R1002_USEN一些PJL命令(有些也与纸盘有关)。
我不确定是否有此帮助,但可以作为将来搜索的提示...
设置这样的功能可能很棘手,尤其是在驱动程序不遵循Microsoft的打印准则的情况下。话虽如此,我们在System.Drawing.Printing.PrinterSettings方面取得了一些成功。我们可以设置PaperSource,但不确定是否可以设置默认值。
如果我们尚未看到此示例,则可能需要进一步研究。它描述了一种存储和重新加载打印机设置的方法。我的一个人向我指出了这一点:
PrinterSettings更改,存储和加载打印机设置
可能有效但对我们无效的另一种方法是确定所需的少数几个设置。使用以下所有设置(即:纸盘1,纸盘2)安装打印机。然后,只需在打印上切换默认打印机即可。不是我们要找的东西,但可能会有所帮助。
在这种情况下,我们通常要做的是让第三方应用程序将数据写入到我们正在监视的文件夹中,然后我们拿起文件并自己解析Postscript或者PCL,然后更换纸盒,然后将其发送到目标设备。听起来可能要简单得多。
dmDefaultSource控制托盘。不幸的是,根据驱动程序的不同,我们希望将其设置为不同的值,因为这是纸槽号,不一定与打印机上打印的纸盘号相同。
以下链接提供了一些VB6代码,用于收集有关打印机纸盘/纸槽分配的信息。我们可以使用该信息以编程方式将dmDefaultSource分配给纸盒的相应纸槽。基本上,我们需要使用DeviceCapabilities返回有关打印机的信息,然后搜索字符串(例如" Tray 1")以获取关联的纸槽号。
http://support.microsoft.com/kb/194789