在VB中調用API函數動態改變及恢復屏幕設置
發表時間:2024-02-16 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:王志紅 對于Windows平臺,顯示器的分辯率和顏色數很重要,尤其是對于多媒體應用軟件和游戲軟件。但許多情況下,用戶當前的屏幕設置并不適合軟件的運行需要。軟件通常的做法是提示用戶將屏幕設置到軟件要求的分辯率及顏色數,再重新啟動軟件。這樣無疑會增加普通用戶操作上的負擔和困難,降低了軟件的友好性...
作者:王志紅
對于Windows平臺,顯示器的分辯率和顏色數很重要,尤其是對于多媒體應用軟件和游戲軟件。但許多情況下,用戶當前的屏幕設置并不適合軟件的運行需要。軟件通常的做法是提示用戶將屏幕設置到軟件要求的分辯率及顏色數,再重新啟動軟件。這樣無疑會增加普通用戶操作上的負擔和困難,降低了軟件的友好性和易用性。
---- 理想的作法是:在軟件開始時,動態的改變屏幕設置來達到軟件運行的要求。在軟件運行結束后,再自動把屏幕設置改回原來的設置值。這一切過程都在不知不覺中完成。這一做法可以通過在VB中調用API(應用程序接口)函數做到。實現方法如下:
---- 一、打開一個標準的EXE工程。
---- 二、在“工程”菜單欄下,選取“添加模塊”,為工程添加一個模塊。
---- 并在模塊中添加如下代碼:
‘---------------以下代碼用于得到屏幕的設置參數--------------
Declare Function GetDeviceCaps Lib
"gdi32" (ByVal hdc As Long,
ByVal nIndex As Long) As Long
‘取指定設備信息API函數
Public Const HORZRES = 8
‘三個屏幕常量
Public Const VHORZRES = 10
Public Const BITSPIXEL = 12
‘---------------通過字符COPY進行數據類型轉換--------------
Private Declare Function lstrcpy Lib "kernel32"
Alias "lstrcpyA" (lpString1 As Any, lpString2 As Any) As Long
‘------------------以下結構用于屏幕的初始化-----------------
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
‘------------------設置屏幕的核心API-----------------
Private Declare Function ChangeDisplaySettings
Lib "User32" Alias "ChangeDisplaySettingsA"
(ByVal lpDevMode As Long, ByVal dwflags As Long) As Long
‘------------------設置屏幕的函數-----------------
Public Function SetDispMode(Width As Integer,
Height As Integer, Color As Integer) As Long
(SetDispMode是自己構造的更改屏幕設置的函數來,
它的三個參數Width、Height和Color分別是屏幕的橫向分辨率、
縱向分辨率,顏色位數,其值可為24,16,0等。0為原有顏色設置。)
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結構的Long型的指針。
ChangeDisplaySettings pDevmode, 0
End Function
---- 三、在工程窗體中,加入兩個按鈕Command1和Command2,其Caption屬性分別為“800x600x16”和“恢復原設置”。
---- 其程序代碼為:
‘窗口的“通用 聲明”區
Option Explicit
Dim H, V, Color As Long
’聲名變量,用于保存最初屏幕設置
Private Sub Form_Load()
‘---------------以下代碼用于得到最初的屏幕設備--------------
H = GetDeviceCaps(Form1.hdc, HORZRES)
V = GetDeviceCaps(Form1.hdc, VHORZRES)
Color = GetDeviceCaps(Form1.hdc, BITSPIXEL)
End Sub
Private Sub Command1_Click()
‘調用SetDispMode函數改變屏幕設置
SetDispMode 800, 600, 16
End Sub
Private Sub Command2_Click()
‘恢復最初屏幕設置
SetDispMode Cint(H), Cint(V), Cint(Color)
End Sub
---- 四、將程序編譯執行。
---- 本程序執行后,如果單擊Command1,則您的計算機屏幕顯示模式將被設置為“800x600x16”的顯示模式;如果單擊Command2, 則您的計算機屏幕顯示模式將被設置為原來的顯示模式。此程序稍加修改,即可放置于桌面或任務欄中,直接快捷的修改屏幕設置。