|
本帖最后由 hiyou 于 2012-5-7 11:42 编辑
因为某种需要,确切来说,有朋友提出要在一个能用VBS和ACTIVE的应用程序里,通过VBS自动切换打印机(他的要求是可以用代码在界面上切换PDF打印机和"正常"的打印机)
我翻了一下,以前在这个论坛有过朋友提出怎么检查打印机状态的求助贴子,但没有完整控制打印机的例程,这次补上
代码用的是MICROSOFT的WMI服务,通过WMI取得各种WMI系统对象——这里先取得本机打印机集合,然后查找或设置某台打印机、或控制打印机;
示例只给出了怎么枚举打印机、状态(以前那个贴子也有)、查找和设置切换默认打印机的例程.
代码适用于VBS脚本和VBA,它需用到WMI服务,所以一般是XP以后系统,2000以前的不行
WMI打印机对象相关资料在这里可以查到(鸟语警告)
http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx
[code=vb]
call wmilistprint '<==枚举本机打印机,列出状态,列出默认打印机
'
'找出单独的默认打印机
set myprinter=getDefaultPrinter
msgbox "系统当前默认的打印机是:" & myprinter.name
'
'设置默认的打印机,打印机名根据自已机上的实际情况设定
'可以从wmilistprint列出的打印机名中找
strSetPrint="adopdf"
if setdefaultprinter(strSetprint) then
msgbox "设置 " & strSetprint & "为默认打印机"
else
msgbox "设置 " & strSetprint & "为默认打印机失败"
end if
'_______________________
'返回本机打印机对象集合
Function getPrinters()
'取得WMI服务
Set objWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
'查找系统所有打印服务(这是集合)
Set getPrinters= objWMI.ExecQuery("Select * from Win32_Printer")
End Function
'_______________________
'返回默认打印机对象
Function getDefaultPrinter()
getDefaultPrinter=""
set cols=getPrinters()
For each prnX in cols
if prnX.Default=true then
set getDefaultPrinter=prnX
exit Function
end if
Next
End Function
'_______________________
'以字符名为依据设置默认打印机
'成功返回TRUE,失败返回FALSE
Function SetDefaultPrinter(strName)
SetDefaultPrinter=FALSE
set cols=getPrinters()
For each prnX in cols
if ucase(prnX.name)=ucase(strName) then
prnx.SetDefaultPrinter
SetDefaultPrinter=True
exit Function
end if
Next
End Function
'例子:枚举本机所有打印机
Sub WMIListPrint()
Set colPrinters = getPrinters()
strMsg = ""
'遍历
For Each objx In colPrinters
strMsg = strMsg & "打印机名: " & objx.Name & ","
'strMsg = strMsg & objx.Location & ","
Select Case objx.PrinterStatus
Case 1
strList = "其它状态"
Case 2
strList = "不明"
Case 3
strList = "等待"
Case 4
strList = "打印中..."
Case 5
strList = "开机"
End Select
strMsg = strMsg & "打印机状态: "
strDefault=""
if objx.Default=true then
strDefault= " -默认打印机- "
end if
strMsg=strMsg & strList & strDefault & vbCrLf
Next
MsgBox strMsg
End Sub
[/code]
楼下有朋友提了运行的问题,说明一下.
代码原本作VBS脚本(也可作VBA代码使用)
不过它们有点区别,在VBA里,一定要有SUB和FUNCTION,而VBS就不用,VBS看到有代码直接往下执行,VBA只有在DEBUG框里才能这么干,要么就从某个SUB或MAIN,某个事件某个FORM开始.
而在这些代码里,第一个FUNCTION之前的几行代码都是测试和演示效果用的,所以把这些代码复制到一个文本文件里,并保存为VBS后缀,就是VBS脚本直接执行,应该OK(除了设置那个打印机一般会失败,但这不是代码的问题)
换成VBA的话,在FUNCTION之前的代码就要用SUB XXX 和END SUB框住,然后执行XXX例程测试,这一点仔细想一想大概清楚吧
参考贴,当时楼下提出WSH和WMI解决的方法,楼主想要查状态
http://club.excelhome.net/thread-555283-1-1.html
这个更早了,我只写了一个点,对大多数人双面打印不一定有用,不过多少解释了WMI的用法,还有就是对打印机的输出控制
http://club.excelhome.net/thread-305474-1-1.html
|
评分
-
3
查看全部评分
-
|