说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
在VB中调用API函数动态改变及恢复屏幕设置
作者:王志红
对于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, 则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。
Eclipse 4.3 正式版发布 代号Kepler 为兴趣而生 七大编程挑战项目,你敢来吗? iOS 7辅助功能:左右摇头控制iOS设备 挑战传统关系型数据库:Facebook图形数据库TAO揭秘 揭秘“棱镜计划”幕后的技术 你更新了吗?Visual Studio 2013 Preview和.NET 4.5.1同时发布 你主要使用什么编程语言? 跨平台游戏开发工具App Game Kit或将新增更多强悍功能 移动应用推广的那些事儿:应用发现篇 DDoS攻击也能成为一种云计算服务 Netflix开源Hadoop集群调度工具:日处理近万作业、上千TB数据 传谷歌正开发自己的视频游戏主机和智能手表 AMD APU战略转型:全民四核,发力“云+端” 富士康自主研发智能手表 惹苹果发来订单 开发者眼中的iOS 7:重设计过程没想象中那么糟 游戏引擎Unity宣布免费支持Windows Phone 8及Xbox One 蝉游记王益善专访:7人小团队实现App 30万下载量 去除IE 10广告的两种方法 直接拿来用!最火前端开源项目(二) 工作变得简单又高效 试试这八个WebApp 移动周报:生于微信,疯狂猜图的推广经 DataTorrent 将数据分析速度从“实时”提升至“现在时” 华为FusionCube开启全球规模商用 黑暗架构:以最少时间完成系统升级并获客户认可的开发之道 Hadoop Summit 2013见闻:创业与Hadoop 2.0不可阻挡 Facebook的清洁能源改革——革命尚未成功,仍需努力 YARN或将成为Hadoop新发力点 主流编程语言属性一览(多图) 粉碎硬件复杂论:开发者不懂硬件运行的方式怎么可以?! 最新版Chrome OS加入Word和Excel编辑功能 直指微软 传诺基亚将购诺西全部股份,疑为出售手机业务做准备? ----怎么在程序打包后创建一个卸载的快捷方式? java 做的记事本中如何加打印功能 打造功能最强,代码风格最标准的留言簿,欢迎挑刺. 问个关于结贴的问题 如何在Tcl脚本里执行Tk命令? C#下如何做饼图,曲线和柱图 装了VS.NET不知道怎样新建一个ASP.NET文件,请指点 请大家帮忙给我一些asp.net设计框架的资料? 要光盘一打开就能打开一个IE 中秋大送分,祝大家节日快乐,心想事成!! 中秋大送分,祝大家节日快乐,心想事成!! 用ADO可以连上数据仓库MSOLAP,可查询出来的数据不对呀,什么控件支持数据仓库?请高手指教! 中秋大送分,祝大家节日快乐,心想事成!! 如何在Tcl脚本里执行Tk命令? 第一次用VB:请问如何用VB调用一个Console.msi的安装程序?? 中秋大送分,祝大家节日快乐,心想事成!! 关于库存调拨成本计算的问题 关于用户控件的使用 关于.o文件转化为.elf的问题。在线等! 招聘 关于库存调拨成本计算的问题 新手 祝大家中秋节百事可乐! 抢答题:如何改变XP和WINDOWS98的启动顺序 关与asp.nt的编辑软件?我有你个是英文的有中文的吗?上那种asp.net专用的. 请帮忙看看http://expert.csdn.net/Expert/topic/2247/2247767.xml?temp=.7379419 用JMail组件写的邮件系统,怎样设置已查看的邮件为已读? jboss配置好了http://localhost:8080/jmx-console/index.jsp能打开但是? 如何检测数据库操作中发生了错误? 怎么样选择表A中字段YpID与表B中字段YpID内容不相同的所有记录的所有字段? 怎样才能把win98的登录模块替换成自己写的登录程序? 为什么我的这句sql语句换成了access数据库就不行了,请给我看看? oracle数据库连接异常? 请教取每周日期的时间段问题!!! 字符串与数组之间的操作问题 应用程序文本输入框显示中文正常,但是copy到记事本显示为乱码,为何? 谁有这个网站的结构图或是总体设计,或是它的功能分析,反正只要能把框架弄清楚就行!! 学习c++的两个月 HTC只能载入一次? 中秋节快乐 ̄ ̄! 如何把Word文件转成一系列图片(要求打印输出效果与原文件相同) 讨论一下 导出到excel问题 为什么昨天结帖的分数今天还没有加到我得账号上^_^ 太霸道了,竟然把我的帖子结帖,这是不人道的 群迁沪上——杭州IT人才新流向 ASP+SQL数据库有没有这样的功能 c#能不能把图片存成PSD格式? 中秋节快乐!!!节日散分 webform下datagrid的多表头实现方法? 各位,请问可不可以在查询中这样给参数! 调查:女友生日你会送什么呢?MM们也可以说说你们喜欢什么 英语翻译请帮忙翻译句子! 通货膨胀为什么导致实际收入减少? 中国历年通货膨胀分别在什么时期?或者历史上比较大的,说明国家和时间,谢谢 求一活捉野外松鼠的有用办法, 传国玉玺下落? 传国玉玺得下落? 六年级语文题(边玩边学)猜字谜1.春节放假三天.2.开始还有一点美,谁知后来全不美.3.一口咬去多半截.4.两人力大冲破天.5.有人无人都是你. 何晏七岁,明慧若神,魏武奇爱之,以晏在宫内,因欲以为子.宴乃画第令方,自处其中.人问其故,答曰:"何氏之庐也."魏武知之,即溃还外.(1)的意思何氏之庐的庐______________________________人问奇故的故__ 发的有分!成语减法( )亲不认-( )无所之=(九)花八门杜甫的蜀相指的是-------------------------把相反的意思连起来(直接1A)1.指鹿为马 A.棉上添花2.固若金汤 B.粗制滥造3.精雕细刻 C.点石 下面是小强写给他爷爷信中的一个片断,加横线的部分有语病,请加以改正……我们已有几个月未见面了,我常常惦念您.①有时思念之初,我恨不得一下子很快到您的身旁,②向您汇报和倾诉思念 英语翻译Dialogues About EatingIt tastes stale!The two people in the dialogue below want to fix pork chops for dinner,but they later find out that the meat has gone bad.Wayne:What are we going to eat for dinner?Lilia:I'm going to fix some pork cho 马云谈\"来往\":我和马化腾在下棋国家卫计委要求严惩温岭医生被刺事件凶伊朗停丰度20%铀浓缩 伊朗政府尚未日本福岛外海强震上修为7.1级 东京海军三大舰队首次在西太平洋实兵对抗前美国国安局长“私聊”遭邻座“直播”美媒体称俄外交官在美招间谍 费用俄方美恶妇险扯断幼儿生殖器用胶粘合 面临商务部谈第四次中欧经贸高层对话30余国领导人遭美监听 偏爱私人手机美电视台脱口秀节目“杀中国人言论”被省运会徐州赛区招募2000名志愿者复旦被告辩称投毒是巧合今晨最低 16.8℃沛县上甘岭战役老兵找到战友广州恒大农银14天理财基金发行动漫游戏“戈尔户外大讲堂”热闹开讲湖人亏大发了明年4月份自考星光小学组织学生观看励志电影暗黑天使刀噬左手仙缘凡神王爷请息怒化龙天尊重生之长风破浪魁星踢斗之盗墓传奇江山图警花吾妻子夜巫灵宝山环区绿色步道旅游共青森林公园旅游大宁灵石公园旅游静安雕塑公园旅游庆修院旅游鲤鱼潭旅游鸡鸣寺旅游永康商圈旅游达坂城风力发电站旅游通天峡旅游太行山大峡谷旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘