龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
对于Windows平台,显示器的分辩率和颜色数很重要,尤其是对于多媒体应用软件和游戏软件。但许多情况下,用户当前的屏幕设置并不适合软件的运行需要。软件通常的做法是提示用户将
对于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,则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。->

精彩图集

赞助商链接