在VB中调用API函数动态改变及恢复屏幕设置

2018-06-17 17:12:26来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

对于Windows平台,显示器的分辩率和颜色数很重要,尤其是对于多媒体应用软件和游戏软件。但许多情况下,用户当前的屏幕设置并不适合软件的运行需要。软件通常的做法是提示用户将屏幕设置到软件要求的分辩率及颜色数,再重新启动软件。这样无疑会增加普通用户操作上的负担和困难,降低了软件的友好性和易用性。
----理想的作法是:在软件开始时,动态的改变屏幕设置来达到软件运行的要求。在软件运行结束后,再自动把屏幕设置改回原来的设置值。这一切过程都在不知不觉中完成。这一做法可以通过在VB中调用API(应用程序接口)函数做到。实现方法如下:

----一、打开一个标准的EXE工程。

----二、在“工程”菜单栏下,选取“添加模块”,为工程添加一个模块。

----并在模块中添加如下代码:

‘---------------以下代码用于得到屏幕的设置参数--------------
DeclareFunctionGetDeviceCapsLib
"gdi32"(ByValhdcAsLong,
ByValnIndexAsLong)AsLong
‘取指定设备信息API函数
PublicConstHORZRES=8
‘三个屏幕常量
PublicConstVHORZRES=10
PublicConstBITSPIXEL=12
‘---------------通过字符COPY进行数据类型转换--------------
PrivateDeclareFunctionlstrcpyLib"kernel32"
Alias"lstrcpyA"(lpString1AsAny,lpString2AsAny)AsLong
‘------------------以下结构用于屏幕的初始化-----------------
ConstCCHDEVICENAME=32
ConstCCHFORMNAME=32

PrivateTypeDEVMODE
dmDeviceNameAsString*CCHDEVICENAME
dmSpecVersionAsInteger
dmDriverVersionAsInteger
dmSizeAsInteger
dmDriverExtraAsInteger
dmFieldsAsLong
dmOrientationAsInteger
dmPaperSizeAsInteger
dmPaperLengthAsInteger
dmPaperWidthAsInteger
dmScaleAsInteger
dmCopiesAsInteger
dmDefaultSourceAsInteger
dmPrintQualityAsInteger
dmColorAsInteger
dmDuplexAsInteger
dmYResolutionAsInteger
dmTTOptionAsInteger
dmCollateAsInteger
dmFormNameAsString*CCHFORMNAME
dmUnusedPaddingAsInteger
dmBitsPerPelAsInteger
dmPelsWidthAsLong
dmPelsHeightAsLong
dmDisplayFlagsAsLong
dmDisplayFrequencyAsLong
EndType
‘------------------设置屏幕的核心API-----------------
PrivateDeclareFunctionChangeDisplaySettings
Lib"User32"Alias"ChangeDisplaySettingsA"
(ByVallpDevModeAsLong,ByValdwflagsAsLong)AsLong
‘------------------设置屏幕的函数-----------------
PublicFunctionSetDispMode(WidthAsInteger,
HeightAsInteger,ColorAsInteger)AsLong
(SetDispMode是自己构造的更改屏幕设置的函数来,
它的三个参数Width、Height和Color分别是屏幕的横向分辨率、
纵向分辨率,颜色位数,其值可为24,16,0等。0为原有颜色设置。)
ConstDM_PELSWIDTH=&H80000
ConstDM_PELSHEIGHT=&H100000
ConstDM_BITSPERPEL=&H40000
DimNewDevModeAsDEVMODE
DimpDevmodeAsLong
WithNewDevMode
.dmSize=122
IfColor=0Then
‘如果Color=0则只改变屏幕的分辨率,而不改变色彩。
.dmFields=DM_PELSWIDTHOrDM_PELSHEIGHT
Else
‘如果Color不等0则改变屏幕的分辨率和色彩。
.dmFields=DM_PELSWIDTHOrDM_PELSHEIGHTOrDM_BITSPERPEL
EndIf
.dmPelsWidth=Width
.dmPelsHeight=Height
IfColor<>0Then
.dmBitsPerPel=Color
EndIf
EndWith
pDevmode=lstrcpy(NewDevMode,NewDevMode)
‘得到一个指向NewDevMode结构的Long型的指针。
ChangeDisplaySettingspDevmode,0
EndFunction

----三、在工程窗体中,加入两个按钮Command1和Command2,其Caption属性分别为“800x600x16”和“恢复原设置”。

----其程序代码为:

‘窗口的“通用|声明”区
OptionExplicit
DimH,V,ColorAsLong
'声名变量,用于保存最初屏幕设置
PrivateSubForm_Load()
‘---------------以下代码用于得到最初的屏幕设备--------------
H=GetDeviceCaps(Form1.hdc,HORZRES)
V=GetDeviceCaps(Form1.hdc,VHORZRES)
Color=GetDeviceCaps(Form1.hdc,BITSPIXEL)
EndSub

PrivateSubCommand1_Click()
‘调用SetDispMode函数改变屏幕设置
SetDispMode800,600,16
EndSub

PrivateSubCommand2_Click()
‘恢复最初屏幕设置
SetDispModeCint(H),Cint(V),Cint(Color)
EndSub

----四、将程序编译执行。

----本程序执行后,如果单击Command1,则您的计算机屏幕显示模式将被设置为“800x600x16”的显示模式;如果单击Command2,则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。->

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在VB中直接用ODBCAPI访问数据库

下一篇:VB从零开始编外挂(一)