VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(47)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:10001, 日期:2002-02-02
VB问题全功略(47)

231、如何知道您的机器中预设打印机的机型、驱动程序及连接端口?(二)
232、如何在程序中更改预设的打印机?
233、如何读取及设定 NumLock / CapsLock / ScrollLock 的值?
234、如何在 Windows95/98 中如何自动结束由 Shell 启动之 DOS 视窗?
235、如何使用 Windows 的选择目录对话框

231、如何知道您的机器中预设打印机的机型、驱动程序及连接端口?(二)

在 问题: 如何知道您的机器中预设打印机的机型、驱动程序及连接端口 中我们曾经提过使用 GetProfileString API 到 Win.ini 文件中抓取这些资料,其实如果不使用 API,我们还是可以使用 Printer 物件很轻易的就得到我们要的资料!

Printer 物件有很多个属性,其中三个是:

DeviceName:返回驱动程序支持的周边设备名称。
DriverName:返回 Printer 物件的驱动程序名称。
Port:返回连接端口。

使用实例如下:

Private Sub Command1_Click()
Debug.Print Printer.DeviceName
Debug.Print Printer.DriverName
Debug.Print Printer.Port
End Sub
Printer 物件还有很多好用的属性及方法,例如设定打印机的打印方向 (Orientation)、纸张大小 (PaperSize)、打印份数 (Copies)、打印品质 (PrintQuality)、放大缩小 (Zoom)...等,大家可以自行到线上手册或 Msdn 上查询!

232、如何在程序中更改预设的打印机?

在上一个单元中,我们使用 Printer 物件来取得机器中预设打印机的机型、驱动程序及连接端口,那是否可以更改预设打印机呢?可以的,不过除了 Printer 物件之外,这次我们要多用一个 Printers 集合物件!

先来看一段程序码:

Private Sub Form_Load()
注释:利用 Printers 集合物件取得所有打印机
For i = 0 To Printers.Count - 1
注释:在 Combo1 中依序加入打印机名称
Combo1.AddItem Printers(i).DeviceName
Next
注释:将目前的预设打印机放在 Combo1.Text 中
Combo1.Text = Printer.DeviceName
End Sub

Private Sub Command1_Click()
注释:未选择
If Combo1.ListIndex = -1 Then
MsgBox "打印机未更改,请先选择打印机!"
Exit Sub
End If
注释:使用者选定之打印机设定为预设打印机
Set Printer = Printers(Combo1.listindex)
End Sub
在这一段程序中,我们在 Form_Load 中先利用 Printers 集合物件找出所有的打印机名称,放在 Combo1 中,记得 Combo1 不可将 Sorted 设成 True,这样子的话,Combo1 的索引值 (Index) 便会和 Printers 集合物件的索引值 (Index) 相同!

使用者在 Combo1 中选定打印机后,在 Command1_Click 中,我们便可以将 Combo1 的索引值带入Printers 集合物件的索引值,重新设定新的预设打印机。

这样子的设定只有在程序中有效,程序结束后,预设打印机会恢复成原来的预设打印机!

233、如何读取及设定 NumLock / CapsLock / ScrollLock 的值?

若只是要取得这三个按键 (NumLock / CapsLock / ScrollLock) 的状态,只要呼叫 GetKeyState API 就可以了!
若是要设定这三个按键的状态,则要呼叫 GetKeyboardState 及 SetKeyboardState 二个 API!

在表单的声明区中,加入以下的声明及模组:

Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long

Private Sub SetKeyState(intKey As Integer, fTurnOn As Boolean)
注释:取得键盘目前的状态,设定您想设定的任意键,再将其他键还成之前的状态,只改变一个键值
Dim abytBuffer(0 To 255) As Byte
GetKeyboardState abytBuffer(0)
abytBuffer(intKey) = CByte(Abs(fTurnOn))
SetKeyboardState abytBuffer(0)
End Sub

Function GetCapslock() As Boolean
注释:返回 Capslock 的状态
GetCapslock = CBool(GetKeyState(vbKeyCapital) And 1)
End Function

Function GetNumlock() As Boolean
注释:返回 Numlock 的状态
GetNumlock = CBool(GetKeyState(vbKeyNumlock) And 1)
End Function

Function GetScrollLock() As Boolean
注释:返回 ScrollLock 的状态
GetScrollLock = CBool(GetKeyState(vbKeyScrollLock) And 1)
End Function

Sub SetCapslock(Value As Boolean)
注释:设定 Capslock 的状态
Call SetKeyState(vbKeyCapital, Value)
End Sub

Sub SetNumlock(Value As Boolean)
注释:设定 Numlock 的状态
Call SetKeyState(vbKeyNumlock, Value)
End Sub

Sub SetScrollLock(Value As Boolean)
注释:设定 ScrollLock 的状态
Call SetKeyState(vbKeyScrollLock, Value)
End Sub
实际运用的方式如下:

Private Sub Command1_Click()
SetScrollLock True 注释: 设定 ScrollLock 为 On
End Sub

Private Sub Command2_Click()
MsgBox "ScrollLock:" & GetScrollLock 注释: 取得 ScrollLock 状态
End Sub
下载范例程序码

234、如何在 Windows95/98 中如何自动结束由 Shell 启动之 DOS 视窗?

以前,在 Windows 3.1、Windows for Workgroups 3.11 及 Windows NT 3.51 中,当您从 VB 程序中使用 Shell 去启动一个 Batch 文件或 MS-DOS 程序,当 Batch 文件或 MS-DOS 程序结束后,会自动关闭 DOS 视窗。

但是,到了 Windows 95/98 之后,自动关闭的功能不见了,所以当您使用 Shell 去启动一个 Batch 文件或 MS-DOS 程序之后,总是会留下一个 DOS 视窗在工作列中,还要使用者自己去将这个 DOS 视窗关闭。

要避免这种情形发生,其实很简单,只要在您原来执行的 Shell 指令中加上 "/C" 就可以了!语法如下:

h = Shell("COMMAND.COM /C <pathname>")

加上 "/C" 之后,在 Windows 95/98 中 DOS 视窗便会自动关闭,而在 在 Windows 3.1、Windows for Workgroups 3.11 及 Windows NT 3.51 中也不会有问题产生!

看个实例吧:

Private Sub Command1_Click()
h = Shell("COMMAND.COM /C c:\windows\command\edit.com")
End Sub
当您结束 Edit.com 时,DOS 视窗便会自动关闭!
235、如何使用 Windows 的选择目录对话框

声明:
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260

Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
函数:
Public Function BrowseForFolder(hWndOwner As Long, sPrompt As String) As String

Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo

With udtBI
.hWndOwner = hWndOwner
.lpszTitle = lstrcat(sPrompt, "")
.ulFlags = BIF_RETURNONLYFSDIRS
End With

lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
BrowseForFolder = sPath
End Function