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

在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, 则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。
尹绪森:打开圈子拥抱变化,谈Spark玩家的自我修养 从Healthbook看苹果将如何颠覆移动医疗和健身追踪 Google可穿戴:详解Android Wear的十大功能 初创企业非技术人员的迷思 【OSTC讲师专访】王兴博:Genesis-3D,3D开源游戏引擎 Facebook发布开源项目Tweaks,让iOS应用开发更加便捷 移动开发创业团队再下一城!UCloud与飞流战略合作 【走进支付宝】即将开场,问题大征集! 开发者薪资调查:半数开发者工作十年方可迎来好“薪”情 沟通更畅快 HipChat推出1对1视频和屏幕共享功能 AMD宣布支持DirectX 12 为游戏开发者带来更多福利 开发者薪资调查:2013年哪种编程语言最赚钱? 苹果挖墙脚未果,黑莓高管跳槽被起诉 不看不知道:六个超大规模Hadoop部署案例 豌豆荚发布应用内搜索技术协议 兼容App Indexing Oculus 21岁鬼才创始人:收购不等于改变 Unite China 2014课程解析:Unity教育行业专场免费开放 Instagram技术窥探,助你打造响应式App 切勿妄谈Hadoop,以及4个数据管道打造实践 一周消息树:雨果&#183;巴拉与小米的那些事儿 《近匠》轻邮联合创始人Wesley:移动App要有撼动企业服务的野心 Facebook开源MySQL分支,谷歌、LinkedIn、Twitter等大拿捧场 淘宝明风:基于Graphx的图计算实践分享 调查显示:2015年Android将统治全球操作系统 初创公司最爱使用的那些开发工具 仙剑之父姚壮宪强势加盟Unity游戏及应用大赛 智能可视化平台:DCOS之数据中心抽象 一周热点:5美分/GB的开源存储系统,及硬盘质量“最差”的希捷 英特尔收购可穿戴技术公司BASIS Science 设计移动App的十大技巧 皮皮网陈超:易用与性能兼备,Spark蓬勃发展! 请问oracle中有没有象SQLServer中的自增字段 请教个弱弱的问题,怎么把GIF的文件转成SWF 如何调用其他窗口的东西? 在win98下用sygate,结果其他机器只能通过ip访问网站,不能通过域名访问,为什么? 分太多,分大家点 ASP中的非常奇怪问题,请大家来看看 菜鸟关于报表横向打印预览的问题 win 2000 的asp服务器测试错误没有提示,怎么设置啊! 谁可以推荐一份好的服务器软件? 有谁知道关于比较好uml网址,(急,马上揭帖) 两个 javabean 中的类怎么继承?谢谢!马上结帖! 在OpenGL中如何使用中文 关于esqlc的unload 的问题。 求助 哪有《卡拉是条狗 》的下载地址呀? 还是crystal report 打印求救!!!! asp与sql的问题 转换代码高分相送!2000分 这是什么意思?大家教下我! 软件开发的基本步骤? SQL查询 紧急求教!! 孤独的SB——写给水园的死者. 请问如何在一个SQL的Select中得到一个Boolean字段的中文名称? outlook如何载入来自文本文件的大量邮件地址列表 请问我想吧dbgrid里面的内容保存到一个string变量里面怎么做, net中ToolbarItem集合编辑器使用 怎么得到ms sql server的本地实例(或服务)列表? IIS如何控制目录访问权限? asp.net 我不懂的问题,不是很难啊。 有关mysql出错的问题?? 牛人们,帮我看看~~~~~~ 调试INTERDEV中的PROJECT? 请问 GetCellDigital返回值有误 目录树记忆属性实现的讨论 关于用户自定义类的问题 自制控件问题 静态链接库中的资源 Xml的查询定位问题? 小高求助! 关于JAVA文件执行时出现的错误 如何在Datagrid中取得当前记录的某字段值? 如何取得下拉菜单项? 目录树记忆属性实现的讨论 我想去中国网通申请域名,他们是不是很吊,有没人用过啊 Help 删除一条记录?? 在研究软件加密 “咱们把最好的粮食给城里人吃,又进城帮助他们盖起了高楼大厦,他们为什么还瞧不起我们呢?” 老板今天叫我签合同 有关于TImage的图像显示速度 怎样让 Title 的显示时间延长????????? 钾长石,钾8.79 钠2.93 铁0.23 硅71.81 钙0.45 铝15.16 白度50左右 卖出价位大概在多少钱,像这种含量用于 双联开关问题院子和屋里的俩个灯(带镇流器的那种电棒)想用一个双联开关,线路怎么接?最好说的详细点,我是菜鸟.有详细的线路图最好就是有2个灯,用那种双控的开关(2个开关在一个盒子 家庭中控制电灯的开关与电灯是()联的;街道两旁的路灯总是同时亮同时灭,他们是()联的 如扬州,过瓜州扬子桥 中的“如”的意思 以“均衡膳食、适量运动、增强体质”为主题写一篇作文、字数不少于500,明天要参加征文比赛, 家用开关 接电 请看图换个新的不会接了 三相电用的那种黑色开关叫什么名字? 关于营养与膳食的论文怎么写? 怎么确定进气压力传感器坏了,求详解 农村的三相电适合用几P的总开关?是总开关! 你不是低血压吗?平时注意点以下几点:多饮水,饮食营养丰富,蛋白质、盐含量高些.多运动,增强体质.运动时要保证盐及水的补充,起立时要慢,少蒸桑拿. 《三国演义》中“七擒孟获”的故事,体现了诸葛亮在《隆中对》中提到的“ ”的思想 0.65g某烃和过量溴加成得到8.65g四氯代烷写出结构简式 obd一与obd二的区别 营养与膳食疑问1、 请简述中国居民平衡膳食宝塔的内容?2、 根据膳食中动物性与植物性食物所占比重的不同,可将世界不同地区的膳食结构分为四种类型,为哪四种类型?每种类型各自有何特 是不是一氯代烷密度都小于水是不是不管一氯还是几氯都是随C增多密度减少 英语翻译Melody is still an enigma .She is obviously very clever but she hates to speak aloud in class.She is the one student that I wish I knew better ,but she is a very private person. 承载生命的载体为什么是圆的? 化学几氯代烷怎么判断.要打字速度快的,讲的详细的. 开关怎样接,急 身体是生命的载体.拥有健康,我们才能演奏出更精彩的生命乐章.谈谈你对这句话的理解. 江苏镇江市有其他区吗? 咋接啊这开关? 意识的载体只有生命么?没有生命还会有意识么? 英语翻译英文缩写式的有没有? 电柜上想接一个急停总开关怎么接?电柜进线是三相电首先接入断路器,然后接几个交流接触器和温度控制仪,本人想在电柜上安装一个可以将电柜里三相电全停的急停开关 请问怎么接? 死亡是终结吗?生命是灵魂的唯一载体吗?3Q 用化学方法鉴别叔丁基氯,氯苯,氯代环己烷 这开关怎么接? 常温常压下92gNO2和N2O4的混合气体含有的原子数为6NA.为什么对?参考书的解释是这样的:NO2和N2O4的混合气体中,不管NO2和N2O4的比例如何,由于NO2和N2O4中N、O原子数目之比为1:2,所以92g混合气体中N 一溴代烷的水解化学方程试 物理选择题,关于液体压强的,求助 关于四川地震的英雄事迹!急! 钾和氟的化合物是什么 关于液体压强的选择题,就A和B,帮我选选啊~水平桌面的烧杯内盛有浓盐水,如果向烧杯内加一定量的清水(未溢出),则( )A 盐水密度减小,烧杯底部受到的液体压强减小B 盐水密度减小,烧杯 化合物PH4I是什么化合物(离子?共价?)为什么?加热怎么会产生有色气体的?那再问一个问题 氯化Be(打不出)是什么化合物啊那氯化呢? 七座桥(图论问题)一笔走完如图所示七座桥,每座桥仅限一次 开关是不是电源 还是用电器? 硫化锂是什么化合物?离子~还是共价~ 引力常量是多少? 在物理电学中,什么叫电键? 买5个凳子和5把椅子需付100元,买5把凳子和2把椅子要付61元,凳子和椅子的单价各是多少要算式 lsd是什么 求水浒英雄的事迹关于林冲,武松,鲁智深,宋江等人的 事迹要简短的 诸葛亮借箭的歇后语是什么 Amphetamine与LSD有什么区别 《水浒传》英雄绰号及事迹我要事迹,写全一点 歇后语:诸葛亮借箭 LSD和麦角菌有什么区别? 家庭接电方法求助:两开关一个插孔两个开关分别控制两个灯,还有一个插孔,这要怎么接啊?(另外,一共有三根线,不是地线,多出来的那根是什么线?求文字描述 歇后语 诸葛亮借箭 后面是什么 含钾元素的化合物一定溶于水吗? 两个开关一个灯这样的电怎么接? 诸葛亮借箭的经过是什么?7楼的我也不知道为什么不射火箭? 一个类似灯泡的符号上面连着电容下面是接地,是什么含义? 断路器上面的2 4 6 我想接两项电,要接哪两个 学校买了5个凳子和5个椅子共付100元买三个凳子和五把椅子共付74元,求凳子和椅子各单价? 江苏省扬州市邗江区瓜州镇的邮编是多少 地球带负电,那为什么物质都呈中性? 歇后语:孔明借箭---------- 中国疾控中心、国家流感中心:H7N9北京119指挥中心:寒衣节烧纸引火灾北京:明年购车摇号指标净减9万 暂不激活社会资本 释放市场能量——十八大法5名醉汉从马戏团\"绑架\"一只羊美国安局被曝重点监视韩国 韩当局索要美国两名移民者闯入国会山抗议被逮捕美国被曝重点监视韩国 韩要求美方做详英国内阁会议严禁使用平板电脑 避免遭巴基斯坦前总统穆沙拉夫获红色清真寺案美国安局被曝重点监视韩国 韩当局索要美国校园又现“枪手”紧急关闭 疑为万看看越南年轻女性的生活有多惊艳(组图英国内阁会议严禁使用平板电脑 避免遭美海军一教练机坠毁 两飞行员受伤送医克里强调美沙关系战略意义 两国关系或刘结一:中国将积极履行维护国际和平与墨西哥军方接管毒品泛滥地区的重要港口媒体称月薪1万者加薪100元政府收走李亚飞任国台办副主任(图/简历)温州瓯江污染臭味赛马桶 排污五六年难20元就可以美美地享受一次专业全套肛里皮首秀憾平 国足主场 0:0 卡塔全国劳模为武汉公共自行车代言新建下水管道将用机器人验收唐金山让公款报销 无法夹带私货“左撇子”阿姨拿不动锅铲依规勒紧地方债的缰绳大一男生十多年来生吃蔬菜武汉海关首次在邮递渠道查获“大麻花”民警彻夜未眠接力找回4.5万元房子临过户时被中介多收5000元父子同泡温泉致脱水发高烧根据英国小说家毛姆同名小说改编,以印周二之约回应本报“省内异地缴罚款难”报道她控诉我背叛了她的友谊浦发银行推出私募基金外包业务“贴心人”刘学锋 视上访人为亲人12位草根“明星”带着感人故事上榜副河南患者来汉取出“巨石”白露辞
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘