打印机处于活动状态时,仅使用registry设置默认打印机VBA

我使用Leith Ross的VBA代码循环浏览机器/networking上的打印机,并select与我作为默认打印机传递的参数相匹配的打印机。 见下文:

Function FindPrinter(ByVal PrinterName As String) As String Dim Arr As Variant Dim Device As Variant Dim Devices As Variant Dim Printer As String Dim RegObj As Object Dim RegValue As String Const HKEY_CURRENT_USER = &H80000001 Set RegObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") RegObj.enumvalues HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Devices, Arr For Each Device In Devices RegObj.getstringvalue HKEY_CURRENT_USER, "Software\Microsoft\Windows NT\CurrentVersion\Devices", Device, RegValue Printer = Device & " on " & Split(RegValue, ",")(1) If InStr(1, Printer, PrinterName, vbTextCompare) > 0 Then FindPrinter = Printer Exit Function End If Next End Function 

这变得稍微复杂一点,因为IT有时会将打印机命名为稍微不同的名称。 不过,我使用的functionfind我正在寻找的打印机,并将其设置为默认的打印机。

当使用此代码的某些计算机具有与其上的打印机的驱动程序/软件重复的实际问题时,只有其中一个在线,而其余的则处于脱机状态。 我通常必须让IT人员卸载脱机驱动程序,否则此function有时会抓取脱机驱动程序,代码不起作用。 我不想依赖他们来做这件事,我只是想修改这个function,只把激活的打印机设置为我将它传递给的任何标准,只要这个打印机符合函数中的Instr条件是激活的。

VBA中是否有任何内容和/或任何可以添加到此代码的内容来检查与Instr条件相匹配的打印机是否实际上联机,并且如果是FindPrinter = Printer Exit Function ? 我的在线search结果并没有真正的帮助。 几乎所有的东西都只是让这个function或其他function来显示/设置默认打印机。

编辑:只是要注意,不是真的在寻找答案,但如果你提供了如何做到这一点,那么我将不胜感激。 如果你更倾向于把我和我在哪里可以find答案/解决scheme的文档联系起来,那么我很乐意做这个研究。

因为这将是一个唯一的答案链接,否则,我张贴下面的相关文字…


毫不客气地从http://www.merrioncomputing.com/Programming/PrintStatus.htm窃取


从Visual Basic获取所选打印机的状态打印机对象错过了什么

在Visual Basic中开发完整和专业的应用程序,打印一直是一个非常有问题的部分。 在Visual Basic 4中引入了新的Printer对象,这在很大程度上得到了纠正。

但是,这个对象有缺点。 最大的缺点是你无法从你的应用程序中发现打印机是否准备好,繁忙,没有纸张等。

幸运的是有一个API调用,GetPrinter返回有关打印机的更多信息。

 Private Declare Function GetPrinterApi Lib "winspool.drv" Alias _ "GetPrinterA" (ByVal hPrinter As Long, _ ByVal Level As Long, _ buffer As Long, _ ByVal pbSize As Long, _ pbSizeNeeded As Long) As Long 

这将处理hPrinter中的打印机,并使用来自打印机驱动程序的信息填充提供给它的缓冲区。 要从Printer对象获取句柄,您需要使用OpenPrinter API调用。 完成后,必须立即使用ClosePrinter API调用来释放该句柄。

 Private Type PRINTER_DEFAULTS pDatatype As String pDevMode As DEVMODE DesiredAccess As Long End Type Private Declare Function OpenPrinter Lib "winspool.drv" _ Alias "OpenPrinterA" (ByVal pPrinterName As String, _ phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long Private Declare Function ClosePrinter Lib "winspool.drv" _ (ByVal hPrinter As Long) As Long 

您将Printer.DeviceName传递给此来获取句柄。

 Dim lret As Long Dim pDef As PRINTER_DEFAULTS lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef) 

不同的状态

打印机驱动程序可以返回许多标准状态。

 Public Enum Printer_Status PRINTER_STATUS_READY = &H0 PRINTER_STATUS_PAUSED = &H1 PRINTER_STATUS_ERROR = &H2 PRINTER_STATUS_PENDING_DELETION = &H4 PRINTER_STATUS_PAPER_JAM = &H8 PRINTER_STATUS_PAPER_OUT = &H10 PRINTER_STATUS_MANUAL_FEED = &H20 PRINTER_STATUS_PAPER_PROBLEM = &H40 PRINTER_STATUS_OFFLINE = &H80 PRINTER_STATUS_IO_ACTIVE = &H100 PRINTER_STATUS_BUSY = &H200 PRINTER_STATUS_PRINTING = &H400 PRINTER_STATUS_OUTPUT_BIN_FULL = &H800 PRINTER_STATUS_NOT_AVAILABLE = &H1000 PRINTER_STATUS_WAITING = &H2000 PRINTER_STATUS_PROCESSING = &H4000 PRINTER_STATUS_INITIALIZING = &H8000 PRINTER_STATUS_WARMING_UP = &H10000 PRINTER_STATUS_TONER_LOW = &H20000 PRINTER_STATUS_NO_TONER = &H40000 PRINTER_STATUS_PAGE_PUNT = &H80000 PRINTER_STATUS_USER_INTERVENTION = &H100000 PRINTER_STATUS_OUT_OF_MEMORY = &H200000 PRINTER_STATUS_DOOR_OPEN = &H400000 PRINTER_STATUS_SERVER_UNKNOWN = &H800000 PRINTER_STATUS_POWER_SAVE = &H1000000 End Enum