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

在VB中調(diào)用API函數(shù)動態(tài)改變及恢復(fù)屏幕設(shè)置

[摘要]作者:王志紅 對于Windows平臺,顯示器的分辯率和顏色數(shù)很重要,尤其是對于多媒體應(yīng)用軟件和游戲軟件。但許多情況下,用戶當(dāng)前的屏幕設(shè)置并不適合軟件的運行需要。軟件通常的做法是提示用戶將屏幕設(shè)置到軟件要求的分辯率及顏色數(shù),再重新啟動軟件。這樣無疑會增加普通用戶操作上的負(fù)擔(dān)和困難,降低了軟件的友好性...
作者:王志紅

對于Windows平臺,顯示器的分辯率和顏色數(shù)很重要,尤其是對于多媒體應(yīng)用軟件和游戲軟件。但許多情況下,用戶當(dāng)前的屏幕設(shè)置并不適合軟件的運行需要。軟件通常的做法是提示用戶將屏幕設(shè)置到軟件要求的分辯率及顏色數(shù),再重新啟動軟件。這樣無疑會增加普通用戶操作上的負(fù)擔(dān)和困難,降低了軟件的友好性和易用性。
---- 理想的作法是:在軟件開始時,動態(tài)的改變屏幕設(shè)置來達(dá)到軟件運行的要求。在軟件運行結(jié)束后,再自動把屏幕設(shè)置改回原來的設(shè)置值。這一切過程都在不知不覺中完成。這一做法可以通過在VB中調(diào)用API(應(yīng)用程序接口)函數(shù)做到。實現(xiàn)方法如下:

---- 一、打開一個標(biāo)準(zhǔn)的EXE工程。

---- 二、在“工程”菜單欄下,選取“添加模塊”,為工程添加一個模塊。

---- 并在模塊中添加如下代碼:

‘---------------以下代碼用于得到屏幕的設(shè)置參數(shù)--------------
Declare Function GetDeviceCaps Lib
"gdi32" (ByVal hdc As Long,
ByVal nIndex As Long) As Long
‘取指定設(shè)備信息API函數(shù)
Public Const HORZRES = 8
‘三個屏幕常量
Public Const VHORZRES = 10
Public Const BITSPIXEL = 12
‘---------------通過字符COPY進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換--------------
Private Declare Function lstrcpy Lib "kernel32"
Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
‘------------------以下結(jié)構(gòu)用于屏幕的初始化-----------------
Const CCHDEVICENAME = 32
Const CCHFORMNAME = 32

Private 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
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End Type
‘------------------設(shè)置屏幕的核心API-----------------
Private Declare Function ChangeDisplaySettings
Lib "User32" Alias "ChangeDisplaySettingsA"
(ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
‘------------------設(shè)置屏幕的函數(shù)-----------------
Public Function SetDispMode(Width As Integer,
Height As Integer, Color As Integer) As Long
(SetDispMode是自己構(gòu)造的更改屏幕設(shè)置的函數(shù)來,
它的三個參數(shù)Width、Height和Color分別是屏幕的橫向分辨率、
縱向分辨率,顏色位數(shù),其值可為24,16,0等。0為原有顏色設(shè)置。)
Const DM_PELSWIDTH = &H80000
Const DM_PELSHEIGHT = &H100000
Const DM_BITSPERPEL = &H40000
Dim NewDevMode As DEVMODE
Dim pDevmode As Long
With NewDevMode
.dmSize = 122
If Color = 0 Then
‘如果Color=0則只改變屏幕的分辨率,而不改變色彩。
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT
Else
‘如果Color不等0則改變屏幕的分辨率和色彩。
.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_BITSPERPEL
End If
.dmPelsWidth = Width
.dmPelsHeight = Height
If Color < > 0 Then
.dmBitsPerPel = Color
End If
End With
pDevmode = lstrcpy(NewDevMode, NewDevMode)
‘得到一個指向NewDevMode結(jié)構(gòu)的Long型的指針。
ChangeDisplaySettings pDevmode, 0
End Function

---- 三、在工程窗體中,加入兩個按鈕Command1和Command2,其Caption屬性分別為“800x600x16”和“恢復(fù)原設(shè)置”。

---- 其程序代碼為:

‘窗口的“通用 聲明”區(qū)
Option Explicit
Dim H, V, Color As Long
’聲名變量,用于保存最初屏幕設(shè)置
Private Sub Form_Load()
‘---------------以下代碼用于得到最初的屏幕設(shè)備--------------
H = GetDeviceCaps(Form1.hdc, HORZRES)
V = GetDeviceCaps(Form1.hdc, VHORZRES)
Color = GetDeviceCaps(Form1.hdc, BITSPIXEL)
End Sub

Private Sub Command1_Click()
‘調(diào)用SetDispMode函數(shù)改變屏幕設(shè)置
SetDispMode 800, 600, 16
End Sub

Private Sub Command2_Click()
‘恢復(fù)最初屏幕設(shè)置
SetDispMode Cint(H), Cint(V), Cint(Color)
End Sub

---- 四、將程序編譯執(zhí)行。

---- 本程序執(zhí)行后,如果單擊Command1,則您的計算機(jī)屏幕顯示模式將被設(shè)置為“800x600x16”的顯示模式;如果單擊Command2, 則您的計算機(jī)屏幕顯示模式將被設(shè)置為原來的顯示模式。此程序稍加修改,即可放置于桌面或任務(wù)欄中,直接快捷的修改屏幕設(shè)置。