明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

在VB中設(shè)置常用的外部設(shè)備

[摘要]空軍導(dǎo)彈學(xué)院 劉建都 ---- 本文首先說明了在VB中設(shè)置常用外圍設(shè)備的方法。然后給出了一個實際例子。 ---- 1. 在VB中啟動控制面板來設(shè)置外部設(shè)備 ---- 在VB中對外部設(shè)備進行設(shè)置的最簡...
空軍導(dǎo)彈學(xué)院 劉建都

---- 本文首先說明了在VB中設(shè)置常用外圍設(shè)備的方法。然后給出了一個實際例子。

---- 1. 在VB中啟動控制面板來設(shè)置外部設(shè)備

---- 在VB中對外部設(shè)備進行設(shè)置的最簡單的方法是直接啟動Windows的控制面板,讓使用者直接使用控制面板來進行設(shè)置,不僅輕松,也不易出錯。雖然控制面板不是一個.exe文件,但通過VB提供的Shell語句可調(diào)出控制面板,具體的語句如下:

Shell “rundll32.exe shell32.dll,
Control_RunDLL”,vbNormalFocus

---- 以上語句的作用就好象是按下“開始”菜單的“設(shè)置->控制面板”一樣,如果希望直接調(diào)出控制面板中的子功能設(shè)置窗口,則是要對上述的語句中加適當(dāng)?shù)男薷,直接調(diào)出常用外部設(shè)備設(shè)置窗口的語句如下:
Shell “rundll32.exe shell32.dll,Control_RunDLL
desk.cpl”,vbNormalFocus ‘調(diào)出顯示器的設(shè)置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl”,
vbNormalFocus ‘調(diào)出鼠標(biāo)的設(shè)置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl @1”,
vbNormalFocus ‘調(diào)出鍵盤的設(shè)置窗口
Shell “rundll32.exe shell32.dll,Control_RunDLL main.cpl @2”,
vbNormalFocus ‘調(diào)出打印機的設(shè)置窗口

---- 大家可能已經(jīng)注意到,調(diào)出子功能設(shè)置窗口的命令是在調(diào)出控制面板主屏幕的命令中加了以.cpl為擴展名的文件及其參數(shù),要使上述命令順利的執(zhí)行,在機器的Windows\System的目錄下必須有desk.cpl和main.cpl這兩個文件;實際上,如果我們在資源管理器中雙擊這一類以為.cpl擴展名的文件,結(jié)果也可以執(zhí)行該文件而顯示出控制面板的某一個子功能。
---- 如果您想知道您的機器中的某些.cpl文件是何用途,最簡單的方法就是執(zhí)行它們。由于“鍵盤”和“打印機”等子功能都沒有對應(yīng)的.cpl文件,它們均包含在main.cpl之中,若要調(diào)出它們須加入相應(yīng)的參數(shù),例如:調(diào)出鍵盤的設(shè)置窗口加入“@1”, 調(diào)出打印機的設(shè)置窗口加入“@2”等。當(dāng)我們在VB中打開了控制面板主窗口或控制面板中子功能設(shè)置的窗口后,就可很方便對常用的外部設(shè)備進行設(shè)置,設(shè)置完成后,關(guān)閉打開的設(shè)置窗口,又會回到VB運行環(huán)境下,就可以進行其它的工作了。

---- 2. 直接利用程序來設(shè)置外部設(shè)備

---- 有時候我們不想調(diào)出控制面板,而想直接利用程序來設(shè)置常用的外部設(shè)備,此時最常用的方法是調(diào)用Windows API函數(shù)來完成常用外部設(shè)備的設(shè)置。

---- 2.1 調(diào)用SystemParametersInfo API函數(shù)來設(shè)置鍵盤、鼠標(biāo)和顯示器

---- SystemParametersInfo API函數(shù)可用來設(shè)置系統(tǒng)的參數(shù),讓我們首先看看這個函數(shù)的定義語句及參數(shù)的含義:

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—決定函數(shù)用途的參數(shù),此參數(shù)的設(shè)置值有90種,
完整的設(shè)置值及每一種設(shè)置值的意義請查閱MSDN/CD
(以SystemParametersInfo為關(guān)鍵值進行查詢)。
uParam—此參數(shù)的用途取決于uAction參數(shù)
lpvParam—此參數(shù)的用途取決于uAction參數(shù)
fuWinIni—此參數(shù)一般設(shè)置為:SPIF_UPDATEINIFILE(值為1)
Or SPIF_SENDWININICHANGE(值為2),其意義為立即更新Win.ini
(或登錄數(shù)據(jù)庫)并且對其它窗口廣播(也就是通知所有執(zhí)行中
的窗口,系統(tǒng)狀態(tài)已經(jīng)有所改變)。
下面就分別說明用該函數(shù)來設(shè)置常用外部設(shè)備的方法。

---- 2.1.1 設(shè)置健盤的延時時間及重復(fù)速度
---- 要設(shè)置健盤的延時時間,參數(shù)uAction的值為:SPI_SETKEYBOARDDELAY(值為23);參數(shù)uParam的值的范圍從0(延時時間約250毫秒)到3(延時時間約1秒),并且與硬件有一定的關(guān)系,下例中設(shè)置該參數(shù)的值為0;參數(shù)lpvParam的值為:vbNullString ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使健盤的延時時間變?yōu)榧s250毫秒。

SystemParametersInfo SPI_SETKEYBOARDDELAY, 0,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)
要設(shè)置健盤的重復(fù)速度,參數(shù)uAction的值為:

---- SPI_SETKEYBOARDSPEED(值為11);參數(shù)uParam的值的范圍從0(每秒重復(fù)約2.5次)到31(每秒重復(fù)約30次),下例中設(shè)置該參數(shù)的值為31;參數(shù)lpvParam的值為:vbNullString ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使健盤的重復(fù)速度變?yōu)槊棵胫貜?fù)約30次。
SystemParametersInfo SPI_SETKEYBOARDSPEED, 31,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1.2 設(shè)置鼠標(biāo)的雙擊時間及按鈕配置
---- 要設(shè)置鼠標(biāo)的雙擊時間,參數(shù)uAction的值為:SPI_SETDOUBLECLICKTIME(值為23);參數(shù)uParam的值的范圍從100毫秒900毫秒,下例中設(shè)置該參數(shù)的值為900毫秒;參數(shù)lpvParam的值為:vbNullString ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使鼠標(biāo)的雙擊時間變?yōu)榧s900毫秒。

SystemParametersInfo SPI_SETDOUBLECLICKTIME, 900,
vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 要設(shè)置鼠標(biāo)的按鈕配置,參數(shù)uAction的值為:SPI_SETMOUSEBUTTONSWAP(值為11);參數(shù)uParam的值的可為True(習(xí)慣用右手)或False(習(xí)慣用右手),下例中設(shè)置該參數(shù)的值為True(習(xí)慣用右手);參數(shù)lpvParam的值為:vbNullString ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使鼠標(biāo)的按鈕配置設(shè)置為習(xí)慣用右手。
SystemParametersInfo SPI_SETMOUSEBUTTONSWAP,
True,vbNullString,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1.3 設(shè)置屏幕保護程序的啟用狀態(tài)及等待時間
---- 要設(shè)置屏幕保護程序的啟用狀態(tài),參數(shù)uAction的值為:SPI_SETSCREENSAVEACTIVE(值為23);參數(shù)uParam的值的可為True(啟用屏幕保護程序)或False(不啟用屏幕保護程序),下例中設(shè)置該參數(shù)的值為True(啟用屏幕保護程序);參數(shù)lpvParam的值為:0& ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使屏幕保護程序的為啟用狀態(tài)。

SystemParametersInfo SPI_SETSCREENSAVEACTIVE,True,
0&, SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 要設(shè)置屏幕保護程序的等待時間,參數(shù)uAction的值為:
SPI_SETSCREENSAVEACTIVEOUT(值為23);參數(shù)uParam的值為屏幕保護程序的等待時間,單位為秒,下例中設(shè)置等待時間為240秒(4分鐘);參數(shù)lpvParam的值為:0& ;參數(shù)fuWinIni的值如前所述;然后在VB中用下面的語句就可使屏幕保護程序的等待時間變?yōu)榧s240秒(4分鐘)。
SystemParametersInfo SPI_SETSCREENSAVEACTIVEOUT,240,0&,
SPIF_UPDATEINIFILE Or SPIF_SENDWININICHANGE)

---- 2.1 調(diào)用其它 API函數(shù)來設(shè)置打印機和顯示器
---- 2.2.1 設(shè)置系統(tǒng)的默認(rèn)打印機

---- 要設(shè)置系統(tǒng)的默認(rèn)打印機,我們首先必需知道系統(tǒng)安裝了哪些打印機驅(qū)動程序,利用VB所提供的Printers集合對象可列舉出系統(tǒng)已安裝的打印機,方法如下:

Dim i As Integer
For i = 0 To Printers.Count - 1
print Printers(i).DeviceName & ","
&Printers(i).DriverName & "," & Printers(i).Port
Next

---- 要把已安裝的某個打印機設(shè)置為系統(tǒng)的默認(rèn)打印機,須在Win.ini中的[windows]節(jié)區(qū)中寫入”Device”Value,然后用通知當(dāng)前的應(yīng)用程序,使剛才的設(shè)置起作用。
---- 具體方法如下:

Device=打印機名稱,驅(qū)動程序名稱,輸出端口
SendMessage HWND_BROADCAST, WM_WININICHANGE,
32767&, ByVal "windows"

---- 2.2.2 設(shè)置屏幕的顏色數(shù)及分辨率
---- 要改變屏幕的顏色數(shù)(例如:16、256、65535)及分辨率(例如:640×480、800×600、1024×768),所要調(diào)用的API函數(shù)是:

Declare Function ChangeDisplaySettings Lib
"user32" Alias "ChangeDisplaySettingsA"
(lpDevMode As Any, ByVal dwflags As Long) As Long

---- 其中:第一個參數(shù)是一個用戶自定義的類型,含有與屏幕顏色及分辨率有關(guān)的項,將要設(shè)置的顏色及分辨率填入該數(shù)據(jù)結(jié)構(gòu)的變量中,然后使用此參數(shù)傳入。
---- 第二個參數(shù)一般填入CDS_UPDATEREGISTRY(值為1),表示除了改變目前屏幕的設(shè)置值外,也改變登數(shù)據(jù)庫中屏幕的設(shè)置值。

---- 該函數(shù)的返回值若為0時,則表示成功;該函數(shù)的返回值若為1時,則表示必須重新啟動才能生效;該函數(shù)返回值若為其它值,則表示失敗。

---- 下面通過一個具體的例子來說明來把屏幕設(shè)置為(800×600)256色的方法。創(chuàng)建一個標(biāo)準(zhǔn)的EXE工程,給其添加一個一般模塊,給窗體添加一個命令按鈕(名稱為command1),并輸入下面的代碼:

‘一般模塊中輸入下面的代碼
'定義要用到的常數(shù)、用戶自定義類型、API函數(shù)及變量
Public Const CCHFORMNAME = 32
Public Const CCHDEVICENAME = 32
Public Const DM_BITSPERPEL = &H40000
‘表示要更改屏幕的顏色數(shù)
Public Const DM_PELSWIDTH = &H80000
‘表示要更改屏幕的寬度
Public Const DM_PELSHEIGHT = &H100000
‘表示要更改屏幕的高度
Public Const CDS_UPDATEREGISTRY = 1
‘表示要更改屏幕的高度并修改登錄數(shù)據(jù)庫
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 =顏色數(shù)
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 "設(shè)置成功,登錄數(shù)據(jù)庫也跟著更改了!"
Elseif ret=1 then
MsgBox "重開機方能生效!"
Else
MsgBox "設(shè)置失效!"
End If
End Sub

---- 運行該工程后,當(dāng)用戶單擊命令按鈕上時,若你的顯示器支持(800×600)256色的設(shè)置,則會將顯示器設(shè)置為(800×600)256色,否則顯示提示信息。上述例子筆者用VB6在Windows 95下運行通過,讀者可不加修改的運行;另外要說明的是,除了上述例子外,文中所述的其它設(shè)置方法,筆者均用VB6在Windows 95下運行通過,由于篇幅有限,未給出全部代碼。