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

2016-02-19 18:27 6 1 收藏

每个人都希望每天都是开心的,不要因为一些琐事扰乱了心情还,闲暇的时间怎么打发,关注图老师可以让你学习更多的好东西,下面为大家推荐在VB中调用API函数动态改变及恢复屏幕设置,赶紧看过来吧!

【 tulaoshi.com - 编程语言 】

对于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
  IfColor0Then
  .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,则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。->

来源:https://www.tulaoshi.com/n/20160219/1617712.html

延伸阅读
在 C++ 中我们能够通过 LoadLibrary, GetProcAddress 来动态调用 dll 的导出函数. 在 C# 中也能够用这样的方式吗? 在 DotNet 2.0 里面这样是可以的, 这完全得益于 2.0新增的一个函数,Marshal.GetDelegateForFunctionPointer 方法。此方法在 .NET Framework 2.0 版中是新增的。 将非托管函数指针转换为委托。 实例代...
Windows98系统的许多软件中都包含一个windows风格的about窗口,它向用户反映了当前系统的一些基本信息,其中显示有关windows及其应用软件的版本、版权和系统的工作状态等信息。笔者用VB6.0通过调用API函数设计应用系统的ABOUT窗口。 1.建立含有如下控件的窗体: 控件NAMECAPTION 窗体FORM1用VB6.0设计ABOUT窗口命令按钮C...
功能强大的API(应用程序接口)函数对于VB(VisualBasicForWindows)程序员来说,不愧是很好的编程工具,然而使用API函数的程序员也许都遇到这样的现象。在VB集成环境下,程序运行后,出现一错误信息对话框,按确定键后系统自动退出VB集成环境,此时如果你的程序尚未存盘,那末很遗憾挽回损失已回天乏力。最后一次存盘之后的程序都不复存在。这...
介绍 API(Application Programming Interface),我想大家不会陌生,它是我们Windows编程的常客,虽然基于.Net平台的C#有了强大的类库,但是,我们还是不能否认API在Windows编程中的重要性。大多数的编程语言都支持API编程,而.Net平台中的MFC(Microsoft Foundation Class Library)构架本身就封装了大部分的API。 做为程序员,...
在VB6的报表使用过程中,我们会发现这样的一个问题,那就是报表中的数据只能读一次,不管你的库中字段增加也好,删除也好,以及让它显示新的查询结果等,它都不会记变。经过查资料才搞清楚,原来是DataEnvironment的问题.原来,只要Command对象中含有数据记录集合,它就不会重新执行SQL语句,就算是把新的查询语句给DataEnvironment后它也不会执行,解决...

经验教程

407

收藏

52
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部