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

在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, 则您的计算机屏幕显示模式将被设置为原来的显示模式。此程序稍加修改,即可放置于桌面或任务栏中,直接快捷的修改屏幕设置。
用VB作浮动式图标提示按钮 用Visual Basic编写托盘程序 用Visual Basic窗体背景花纹的实现 用Visual Basic设计窗体背景花纹 用Visual Basic设计更好的用户界面 用Visual Basic设计三维图形按钮 用VisualBasic制作半透明窗体 运行时改变控件大小的两种方法-VB资料 运行中隐藏/显示窗口标题栏-VB资料 在ListBox适当设定水平滚动条的宽度-VB资料 在VB中利用API实现窗体的平滑显示 在vb中让控件大小和位置随着表单的大小成比例变化的方法 在VB中实现闪动标题栏 在VB中实现位图的透明放置 在VB中使用数据窗体设计器插件 在VB中制作单独程序封面的两种方法 在VB中制作透明按钮 在Visual Basic中如何拖动窗体或控件 在Visual Basic中显示动态运行进度 在菜单中加入图标 -VB资料 在程序中调用关闭Windows对话框-VB资料 在任务栏中显示无边框窗体的图标-VB资料 在系统菜单上添加自定义菜单项 -VB资料 在运行时动态生成多个相同的控件?-VB资料 在最小化状态时提供提示 -VB资料 暂时禁止窗口更新-VB资料 VB怎样得到文本框(TextBox)中的文本行数? 制造出透明的Form -VB资料 VB制作半透明窗体和形状不规则的窗体 VB制作方向按钮 VB制作渐变的窗口背景色 到底有没有官方出的VS6.0中文版?? 请问怎样给一个buffer中所有数据清0 test 数据采集问题,高手指教!!!急 为何我修改了打印纸尺寸但不起作用? 请问大家现在MCSE的题目变了没有啊? 共同学习 高人指点一下 DataGrid如何实现如下功能? 如何在图片框中按鼠标时知道当前鼠标在图片框中的坐标?谢谢! 【骂人】destroy(只想灌的爽)进来 散分~~~~前5名!谢~ 请教两个问题,专家请进! 请问在什么地方可以找的计算机方面的中英文对照翻译? Dll向主窗口发送自定义消息? 如何用MoveWindow()和SetWindowPos()来改变窗口大小(最好有个例子)! script参数怎样传输到applet中 怎样把jpg转换位BMP,在线急等 我要开放mssql的访问,在防火墙中是不是只要开放1433端口就可以了? 外面买的2000安装盘有的里面只有一个程序,叫什么ghost,好象运行它后就可以非常快的安装2000,请问这个ghost是用哪个软件做的? 系统初始化把所有数据库里面的内容删除,保留表的结构,这是怎么实现的? 如何将AnsiString转换成LPCWSTR? 我想请问一下,当panel显示时如果下面有<select >控件是,这个控件不被盖住,结果好象panel破了下一样,请问题怎么办!谢谢 如何把这个程序转换成java程序,我够菜的:( 高分请教如何实现本地网址过滤?就好像反黄软件,或公安的监控软件一样。 又有问题了 谁能贴一个关于TQUERY,TTABLE等控件的数据库应用的详细使用 我会jsp+servlet sql server完成小项目 找相关工作还咬什么? vs.net的问题,看看你遇到过没有? 答者有分!怎样用超链接调outlook发邮件? 怎样把不同机子上的vc++模块连到一块 关于自增自减运算符的问题-缘引老师的教案 在SCO上配置Informix遇到n多问题 急!寻解线性代数方程组的算法程序或者相关资料 假设在 MDI 程序中打开了3个文档,现在想将其中一个文档提到前面显示 php语法的一个小问题 MM,有个难题急需解决(关于 DateTimePicker控件的) 请看图,长得巨像梁朝伟的工地民工!! §§如何从Variant变量中取出有符号long型值? 关于vc++和visual prolog的接口问题 Exchange 2000 Lotus connector 怎样把<<石器时代>>游戏里的图片和动画弄出来??? 有关PHP使用相对路径访问ACCESS数据库的方法。 大版主,特别是阿信,进来看! 怎么把数字以16进制格式输出 一个奇怪的顺序问题 怎样知道自己被“黑”了? 求一个三角形的组合问题 如何删除CListCtrl的单条或多条选中项 设个标志位,只取0,1两个值,该定什么类型好? 请问如何在vbscript的函数中嵌入asp的response.redirect方法 找个与拼音de mei(得美)发音相似的英语小弟穷就50分 大哥大姐大爷大妈 来帮帮忙咧 ,单词要有好的含义,单词可以是1个,也可以是多个 冷漠的近义词是冷淡吗? 影响人口分布的因素是什么 中文 王美朋Wang Mei peng 女的名字啊 冷漠的近义词 影响我国人口分布的区位因素 电子的电离能,电子的逸出能,有什么关系?电子的电离能,电子的逸出能,有什么区别?请不要重复无聊的定义.请直接剖析、评论.敬请江苏的教育工作者王佩L老师,请止步。 冷漠的近义词是什么ji9 ] 面对死亡总觉得来到这世界不容易 想尽量延长生命 我是不是有心理疾病啊 消化道中哪部分消化液最多 冷淡的近义词一个就行,急啊! 一个带3正电的物体与一个带2负电的物体相摩擦,会怎么样呢 一花一世界一叶一菩提的解释 冷淡的近义词啊? 电场中有A B两点 它们的电势分别是Ua=100伏 Ub=400伏,则A B两点的电势差是什么 消化道中含消化液最多的器官,总量多少 p.r. 货币边际效率为什么会递减官方一点.正式一点.写在作业里的. 千锤百炼GGbog 用显微镜观察装片时,在低倍镜视野中发现有一异物当移动装片时,异物不懂,转换高倍物镜后,异物仍可观察到,则此异物可能存在于为什么不会存在与反光镜上,而是目镜上 边际效率为何递减(真正高手请进)资本边际效率,边际消费倾向,边际进口倾向.这些都是递减的,还有人常说吃一个馒头很满足,吃第二个满足感下降.我想知道这些事件中的本质原因是什么?科 千锤百炼和置之度外 字字皆辛苦的意思是什么.文中最能表现这个意思的一处细节是哪里 陶瓷管在树脂砂铸造中是怎样用的 氟原子最外层电子数为( ),反应中容易( )个电子而显示()价 用显微镜观察装片时,在视野中发现有异物,转动目镜时,异物不动,移动装片时,异物仍不动.则异物可能存在于( ) 希望不吝赐教我想问一下,第二问,为什么直接对F(X.Y)求导不对啊.和求出两个边缘概率密度后求导相乘得结果不一样啊 与氟相邻且最外层电子数相等的元素是什么?它的最高价氧化物对应水化物的化学式是什么? hebei p.r.china. 如果真有2012、我希望我是第1个面对死亡的人 什么叫形而上学?形而上? 字字皆辛苦是什么意思十万火急 请帮忙分析一下句子成份,要详细点的,最好就是分析到单词It makes me sad to hear that you have to go away.it是形式主语,真正是主语是to hear that you have to go away.= To hear that you have to go away makes me sad.所 酶活性最强的温度( ) 2000的因数中,质数有哪些?合数有哪些 分析一个单词在句中的成分an artist who seeks fame is like a dog chasing his own tail who,when he captures it ,doesn't know what else to do but to continue chasing it.第一个逗号里,is like 是什么结构?为什么有两个who,第二 该怎样面对死亡?害怕亲人离去,害怕自己死后什么都不知道,虽然自己出生前也是一无所有,可正因为活过才知道生命的可贵,害怕一觉睡去再也醒不过来,仿佛自己没有来过这个世界? 宏观经济学里的MEC什么意思? 什么情况下,电场强与电流密度方向一致,为什么? 踩到狗屎意味着什么. 唛头上 不知道为什么场强方向是向右.就解释下这个就可以了,其他都会了. 怎么面对死亡?我爸爸得了癌症,我怎么面对爸爸将来某天的死亡?别复制,我不怕死 我不知道我爸爸是什么面对的 你们只要告诉我该什么面对就行了(我今年17岁) MEC-4032中的MEC是什么意思? 同一电场线上的各点,电势一定相等对吗?原因. 踩到狗屎意味着什么?急 落木千山( ),澄江一道( ) 某点电势高,说明该点电场做功本领强,对吗 如何面对死亡? 我对学英语没信心应该怎样办,另外我情绪差很大我是初三的 可是我总感觉我很笨 在电场中,A点的电势高于B点的电势求解释 今天踩到狗屎了,这意味着什么?RT 学英语怎么老是没有信心了 3dsmax 描线生成UVW 贴图总是出错图一是所描的线图二加了UVW map 错误图三删除两处可能出错的线段生成正常要怎么解决?图一图二图三 怎样面对死亡?当年轻生命走到尽头! mec是什么标志? 帮忙想一个参加“三井杯”的队伍名称吧,是一个化工设计比赛,五人一个小队! 新年踩到狗屎意味着什么新年年头我踩到狗屎意味着什么 关于磁场电场的所有公式 什么是资本边际效率? 日土发表共同宣言 安倍决心加强战略伙美华裔众议员称美主持人为攻击性言论道湖南一希望小学被强拆 当地称“项目重教师为讨960元代课费跑15年 江西韩国特种部队女兵彩排不忘自拍留念(组日本女高中生为何讨厌自己的爸爸?美国有意叫停窃听盟国元首 部门“内讧奥巴马提名两名竞选支持者为美国驻外大叙利亚总统巴沙尔再颁大赦令金华男子貌若金城武 3个姑娘心甘情愿第13届中国网络媒体论坛在郑州举行 雪糕也有怪味 日本北之雪糕屋华人油画家潘义奎:艺术家应心怀美好美国华人要求美电视台就播出“杀光中国AKB48将于2014年举行乐曲总选中国与苏联老兵在京见面 促进中俄世代北海舰队两大编队在西太演练导弹攻防(以色列将在东耶路撒冷新建1500个犹导演张元任罗马电影节评委二代谷歌眼镜模型图曝光 科技网站评“专家认为美国财政问题拖累美国及全球经秦市海滨路街道“访万名老人”为更优质新居装修惹烦恼 工商热情暖人心秦皇岛市海港区文化路街道城管中队迅速曹妃甸:孕育热土汇蓝图 抢占“协同”[高清]影蛋开放日 带你走进庄里的艺“道一声辛苦 送一份温暖”社区慰问环邯郸首个“三级平台、两个代办”服务平“速递易”收费后昆明部分小区停用了五一去哪儿?云南墨江玩场多(图)昆明小升初网上报名在即 记者整理十大昆明办理公积金贷款不再要收入证明昆明中院5月1日起实行立案登记制 符昆明小升初网上报名5月1日0点开始 台湾地区爱心送尼泊尔 台外务部门全力昆明今年7月施行新市容卫生管理条例 台\"立法院\"通过临时提案 评估进环保部:处理63家存在问题的建设项目环境保护部党组关于中央巡视整改情况通环保部:针对顶风违反八项规定问题党纪宁夏义工联合会添新助力五一小长假到来 海南交警提示如何顺畅
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘