您的位置:寻梦网首页编程乐园VB 编程乐园VB问题全功略

VB问题全功略(46)

上一页(46)下一页

226、如何知道您的机器中预设打印机的机型、驱动程序及连接端口?(二)
227、如何在程序中更改预设的打印机?
228、如何读取及设定 NumLock / CapsLock / ScrollLock 的值?
229、如何在 Windows95/98 中如何自动结束由 Shell 启动之 DOS 视窗?
230、如何开启文件属性窗口

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

在 问题: 如何知道您的机器中预设打印机的机型、驱动程序及连接端口 中我们曾经提过使用 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 上查询!

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

在上一个单元中,我们使用 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 集合物件的索引值,重新设定新的预设打印机。

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

228、如何读取及设定 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

229、如何在 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 视窗便会自动关闭!

230、如何开启文件属性窗口

声明:
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Long
hInstApp As Long
lpIDList As Long
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hProcess As Long
End Type

Public Const SEE_MASK_INVOKEIDLIST = &HC
Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const SEE_MASK_FLAG_NO_UI = &H400

Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long

代码:
' 使用: ShowProps("c:\command.com",Me.hWnd)
Public Sub ShowProps(FileName As String, OwnerhWnd As Long)
Dim SEI As SHELLEXECUTEINFO
Dim r As Long
With SEI
.cbSize = Len(SEI)
.fMask = SEE_MASK_NOCLOSEPROCESS Or SEE_MASK_INVOKEIDLIST Or SEE_MASK_FLAG_NO_UI
.hwnd = OwnerhWnd
.lpVerb = "properties"
.lpFile = FileName
.lpParameters = vbNullChar
.lpDirectory = vbNullChar
.nShow = 0
.hInstApp = 0
.lpIDList = 0
End With
r = ShellExecuteEX(SEI)
End Sub

上一页(46)下一页