空军导弹学院 刘建都
---- 本文首先说明了在VB中设置常用外围设备的方法。然后给出了一个实际例子。
---- 1. 在VB中启动控制面板来设置外部设备
---- 在VB中对外部设备进行设置的最简单的方法是直接启动Windows的控制面板,让使用者直接使用控制面板来进行设置,不仅轻松,也不易出错。虽然控制面板不是一个.exe文件,但通过VB提供的Shell语句可调出控制面板,具体的语句如下:
Shell “rundll32.exe shell32.dll,
Control_RunDLL”,vbNormalFocus
---- 以上语句的作用就好象是按下“开始”菜单的“设置->控制面板”一样,如果希望直接调出控制面板中的子功能设置窗口,则是要对上述的语句中加适当的修改,直接调出常用外部设备设置窗口的语句如下:
Shell “rundll32.exe shell32.dll,Control_RunDLL
desk.cpl”,vbNormalFocus ‘调出显示器的设置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl”,
vbNormalFocus ‘调出鼠标的设置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl @1”,
vbNormalFocus ‘调出键盘的设置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl @2”,
vbNormalFocus ‘调出打印机的设置窗口
---- 大家可能已经注意到,调出子功能设置窗口的命令是在调出控制面板主屏幕的命令中加了以.cpl为扩展名的文件及其参数,要使上述命令顺利的执行,在机器的Windows\System的目录下必须有desk.cpl和main.cpl这两个文件;实际上,如果我们在资源管理器中双击这一类以为.cpl扩展名的文件,结果也可以执行该文件而显示出控制面板的某一个子功能。
---- 如果您想知道您的机器中的某些.cpl文件是何用途,最简单的方法就是执行它们。由于“键盘”和“打印机”等子功能都没有对应的.cpl文件,它们均包含在main.cpl之中,若要调出它们须加入相应的参数,例如:调出键盘的设置窗口加入“@1”, 调出打印机的设置窗口加入“@2”等。当我们在VB中打开了控制面板主窗口或控制面板中子功能设置的窗口后,就可很方便对常用的外部设备进行设置,设置完成后,关闭打开的设置窗口,又会回到VB运行环境下,就可以进行其它的工作了。
---- 2. 直接利用程序来设置外部设备
---- 有时候我们不想调出控制面板,而想直接利用程序来设置常用的外部设备,此时最常用的方法是调用Windows API函数来完成常用外部设备的设置。
---- 2.1 调用SystemParametersInfo API函数来设置键盘、鼠标和显示器
---- SystemParametersInfo API函数可用来设置系统的参数,让我们首先看看这个函数的定义语句及参数的含义:
Declare Function SystemParametersInfo Lib "user32"
Alias "SystemParametersInfoA" (ByVal uAction As Long,
ByVal uParam As Long, ByVal lpvParam As Any, ByVal
fuWinIni As Long) As Long
其中:uAction—决定函数用途的参数,此参数的设置值有90种,
完整的设置值及每一种设置值的意义请查阅MSDN/CD
(以SystemParametersInfo为关键值进行查询)。
uParam—此参数的用途取决于uAction参数
lpvParam—此参数的用途取决于uAction参数
fuWinIni—此参数一般设置为:SPIF_UPDATEINIFILE(值为1)
Or SPIF_SENDWININICHANGE(值为2),其意义为立即更新Win.ini
(或登录数据库)并且对其它窗口广播(也就是通知所有执行中
的窗口,系统状态已经有所改变)。
下面就分别说明用该函数来设置常用外部设备的方法。
---- 2.1.1 设置健盘的延时时间及重复速度
---- 要设置健盘的延时时间,参数uAction的值为:SPI_SETKEYBOARDDELAY(值为23);参数uParam的值的范围从0(延时时间约250毫秒)到3(延时时间约1秒),并且与硬件有一定的关系,下例中设置该参数的值为0;参数lpvParam的值为:vbNullString ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使健盘的延时时间变为约250毫秒。
SystemParametersInfo SPI_SETKEYBOARDDELAY, 0,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
要设置健盘的重复速度,参数uAction的值为:
---- SPI_SETKEYBOARDSPEED(值为11);参数uParam的值的范围从0(每秒重复约2.5次)到31(每秒重复约30次),下例中设置该参数的值为31;参数lpvParam的值为:vbNullString ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使健盘的重复速度变为每秒重复约30次。
SystemParametersInfo SPI_SETKEYBOARDSPEED, 31,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
---- 2.1.2 设置鼠标的双击时间及按钮配置
---- 要设置鼠标的双击时间,参数uAction的值为:SPI_SETDOUBLECLICKTIME(值为23);参数uParam的值的范围从100毫秒900毫秒,下例中设置该参数的值为900毫秒;参数lpvParam的值为:vbNullString ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使鼠标的双击时间变为约900毫秒。
SystemParametersInfo SPI_SETDOUBLECLICKTIME, 900,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
---- 要设置鼠标的按钮配置,参数uAction的值为:SPI_SETMOUSEBUTTONSWAP(值为11);参数uParam的值的可为True(习惯用右手)或False(习惯用右手),下例中设置该参数的值为True(习惯用右手);参数lpvParam的值为:vbNullString ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使鼠标的按钮配置设置为习惯用右手。
SystemParametersInfo SPI_SETMOUSEBUTTONSWAP,
True,vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
---- 2.1.3 设置屏幕保护程序的启用状态及等待时间
---- 要设置屏幕保护程序的启用状态,参数uAction的值为:SPI_SETSCREENSAVEACTIVE(值为23);参数uParam的值的可为True(启用屏幕保护程序)或False(不启用屏幕保护程序),下例中设置该参数的值为True(启用屏幕保护程序);参数lpvParam的值为:0& ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使屏幕保护程序的为启用状态。
SystemParametersInfo SPI_SETSCREENSAVEACTIVE,True,
0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
---- 要设置屏幕保护程序的等待时间,参数uAction的值为:
SPI_SETSCREENSAVEACTIVEOUT(值为23);参数uParam的值为屏幕保护程序的等待时间,单位为秒,下例中设置等待时间为240秒(4分钟);参数lpvParam的值为:0& ;参数fuWinIni的值如前所述;然后在VB中用下面的语句就可使屏幕保护程序的等待时间变为约240秒(4分钟)。
SystemParametersInfo SPI_SETSCREENSAVEACTIVEOUT,240,0&,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
---- 2.1 调用其它 API函数来设置打印机和显示器
---- 2.2.1 设置系统的默认打印机
---- 要设置系统的默认打印机,我们首先必需知道系统安装了哪些打印机驱动程序,利用VB所提供的Printers集合对象可列举出系统已安装的打印机,方法如下:
Dim i As Integer
For i = 0 To Printers.Count - 1
print Printers(i).DeviceName & ","
&Printers(i).DriverName & "," & Printers(i).Port
Next
---- 要把已安装的某个打印机设置为系统的默认打印机,须在Win.ini中的[windows]节区中写入”Device”Value,然后用通知当前的应用程序,使刚才的设置起作用。
---- 具体方法如下:
Device=打印机名称,驱动程序名称,输出端口
SendMessage HWND_BROADCAST, WM_WININICHANGE,
32767&, ByVal "windows"
---- 2.2.2 设置屏幕的颜色数及分辨率
---- 要改变屏幕的颜色数(例如:16、256、65535)及分辨率(例如:640×480、800×600、1024×768),所要调用的API函数是:
Declare Function ChangeDisplaySettings Lib
"user32" Alias "ChangeDisplaySettingsA"
(lpDevMode As Any, ByVal dwflags As Long) As Long
---- 其中:第一个参数是一个用户自定义的类型,含有与屏幕颜色及分辨率有关的项,将要设置的颜色及分辨率填入该数据结构的变量中,然后使用此参数传入。
---- 第二个参数一般填入CDS_UPDATEREGISTRY(值为1),表示除了改变目前屏幕的设置值外,也改变登数据库中屏幕的设置值。
---- 该函数的返回值若为0时,则表示成功;该函数的返回值若为1时,则表示必须重新启动才能生效;该函数返回值若为其它值,则表示失败。
---- 下面通过一个具体的例子来说明来把屏幕设置为(800×600)256色的方法。创建一个标准的EXE工程,给其添加一个一般模块,给窗体添加一个命令按钮(名称为command1),并输入下面的代码:
‘一般模块中输入下面的代码
'定义要用到的常数、用户自定义类型、API函数及变量
Public Const CCHFORMNAME = 32
Public Const CCHDEVICENAME = 32
Public Const DM_BITSPERPEL = &H40000
‘表示要更改屏幕的颜色数
Public Const DM_PELSWIDTH = &H80000
‘表示要更改屏幕的宽度
Public Const DM_PELSHEIGHT = &H100000
‘表示要更改屏幕的高度
Public Const CDS_UPDATEREGISTRY = 1
‘表示要更改屏幕的高度并修改登录数据库
Type DEVMODE
dmDeviceName As String * CCHDEVICENAME
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
‘填入自定义类型的大小
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperLength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmYResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * CCHFORMNAME
dmUnusedPadding As Integer
dmBitsPerPel As Integer
‘2^ dmBitsPerPel =颜色数
dmPelsWidth As Long
‘分辨率的宽
dmPelsHeight As Long
‘分辨率的高
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
Declare Function ChangeDisplaySettings Lib
"user32" Alias "ChangeDisplaySettingsA"
(lpDevMode As Any, ByVal dwflags As Long) As Long
‘窗体代码项中的代码:
Dim ret As Integer, devM As DEVMODE
Private Sub Command1_Click()
devM(List1.ListIndex).dmFields =
DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
devM.dmSize = Len(devM) ‘填入自定义类型的大小
devM. DmBitsPerPel=8 ‘2^ 8=256色
devM. dmPelsWidth =800 ‘屏幕的宽度为800
devM. dmPelsHeight =600 ‘屏幕的高度为600
‘devM的其它项可以不填
Ret= ChangeDisplaySettings(devM, CDS_UPDATEREGISTRY)
If ret = 0 Then
MsgBox "设置成功,登录数据库也跟着更改了!"
Elseif ret=1 then
MsgBox "重开机方能生效!"
Else
MsgBox "设置失效!"
End If
End Sub
---- 运行该工程后,当用户单击命令按钮上时,若你的显示器支持(800×600)256色的设置,则会将显示器设置为(800×600)256色,否则显示提示信息。上述例子笔者用VB6在Windows 95下运行通过,读者可不加修改的运行;另外要说明的是,除了上述例子外,文中所述的其它设置方法,笔者均用VB6在Windows 95下运行通过,由于篇幅有限,未给出全部代码。
……