【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“【-精品】-利用API函数实现VB程序的抓屏功能 - 技术总结“提供大家参考,希望对大家有所帮助!
ComputerKnowledgeandTechnology电脑知识与技术软件设计开发本栏目责任编辑谢媛媛第6卷第29期2010年10月利用API函数实现
VB程序的抓屏功能韩立四川机电职业技术学院信息工程系四川攀枝花617000摘要该文通过屏幕抓取程序的实例分析详尽阐述了
VB中API函数的声明与使用方法。
关键词API函数VBBitBlt函数中图分类号TP39文献标识码A文章编号100-3044201029-821-0VisualBasic是运行于Windows操作平台的一系列面向对象可视化编程语言之一与其它编程语言相比
VB简单易学、界面友好且具有实用价值深受广大用户的青睐但仅利用
VB语言本身提供的类库无法充分挖掘操作系统给用户提供的强大功能只有充分理解API函数的功能和用法结合语言本身的特点才能深入到Windows系统内部开发出专业化的应用程序。
本文以
VB屏幕抓取程序的实现为实例通过对API中BitBlt等函数的调用分析阐述API函数在
VB中的使用方法。
1API函数概述APIApplicationProgrammingInterface即应用程序编程接口是用C和C编写由操作系统或其它应用程序调用的函数。
API函数由许多“动态链接库”DLL组成这是Windows系统中一种特殊的可执行文件。
常用的API函数动态链接库有Kernel.dllWindows32位核心主要对计算机系统资源如多任务、内存、系统
注册表等进行操作。
Gdi32dll图形设备接口API库主要对
系统的图形图像进行操作。
User32dll用户接口例程库主要对用户接口如窗口管理、菜单、光标、
通信等进行操作。
Netapi32dll32位
网络API库。
Winmmdll多媒体库用于播放波形音频、MIDI音乐和数字式影像。
Winspooldll后台打印接口库包含后台打印API调用函数。
在这些动态链接库中包含了不同数量的API函数而且随着操作系统的更新来自于第三的API函数不断涌现以处理新的操作系统扩展。
2
VB调用API函数的方法在
VB程序中调用API函数时必须先有Declare语句在
代码窗口的“通用”段进行函数声明以确定所使用的API函数的名称、所在库的文件名、函数中使用的参数及数据类型和参数传递方式、函数本身的数据类型。
在声明之后就可以把它当做
VB自己的过程一样使用。
利用
VB调用API函数的一般方法是第一步从
VB的“外接程序”菜单———“外接程序管理器”选项中加载“API浏览器”第二步在打开的“API浏览器”中加载文本文件Win32apitxt从中查找所需API函数的声明并复制该声明第三步在
VB应用
程序中添加一个标准模块并将前面复制的API函数的常数定义等复制到该标准模块中。
如果直接在窗体模块或类模块中声明API函数则需要在函数声明前加Private关键字。
3在
VB中应用API函数的实例实例通过API函数的调用实现
VB的屏幕抓取功能3.1程序界面及功能要求该程序控件使用了两个图片框控件Picture1和Piccopy用于放置抓取的屏幕图片一个水平滚动条Hscroll1和一个垂直滚动条Vscroll1用于图片浏览位置的移动一个通用对话框控件Commondialog1用于保存抓取的图片。
功能简介单击“抓取”菜单时程序窗体隐藏将屏幕当前画面复制到程序窗体的piccopy控件中可以通过拖动滚动条观看piccopy控件中的整个图片单击“存储文件”菜单可将抓取的画面存储为图片文件。
.2“抓取”菜单单击事件分析API中的BitBlt函数功能是将一个设备描述表中的图片复制到另一个设备描述表中。
这正是程序所需的功能。
其书写格式为BitBlthDestDCXYnWidthnHeighthSrcDCxSrcySrcdwRop其中hDestDC表示目标设备句柄hSrcDC表示源设备句柄XY表示目标图像左上角的横、纵逻辑坐标值nWidthnHeight分别表示目标图像的宽度和高度xSrcySrc表示图像左上角的横、纵逻辑坐标值参数dwRop为光栅操作
代码表示复制方式其取值如下所示。
BLACKNESS所有输出变黑。
收稿日期2010-08-17ISSN1009-3044oputernowledgeandTechnology电脑知识与技术Vol6No29October2010pp8231-8233E-mail:xsjlccccnetcnhttp://wwwdnzsnetcnTel:86-551-569096356909648231ComputerKnowledgeandTechnology电脑知识与技术本栏目责任编辑谢媛媛
软件设计开发第6卷第29期2010年10月DSTINVERT反转目标位图。
MERGECOPY使用布尔AND操作符合并特征与源位图。
MERGEPANT使用布尔OR操作符合并特征与源位图。
NOTSRCCOPY拷贝反转源位图到目标。
NOTSRCERASE反转使用布尔OR操作符合并源和目标位图的结果。
PATCOPY拷贝特征到目标位图。
PATNVERT使用布尔XOR操作符合并目标位图和特征。
PATPANT使用布尔OR操作符合并反转源位图和特征。
用布尔OR操作符合并这项操作结果与目标位图。
SRCAND使用布尔AND操作符合并目标像素和源位图。
SRCCOPY拷贝源位图到目标位图。
SRCERASE反转目标位图并用布尔AND操作符合并这个结果和源位图。
SRCNVERT使用布尔XOR操作符合并目标像素和源位图。
SRCPANT使用布尔OR操作符合并目标像素和源位图。
WHTENESS所有输出变白。
需要注意1从上表可知将源矩形区域直接拷贝到目标区域应选中光栅操作参数中的VBSRCCOPY常数2BitBlt函数使用时以Pixel像素为单位而窗体及图片框控件的缺省单位是Twips故需要将用到BitBlt函数的控件及窗体的单位都设为像素。
3要抓取屏幕的画面必须获取当前屏幕的句柄在此又必须调用AP中的另一个函数GetDC在抓取到屏幕画面以后程序需要释放前面获取的屏幕句柄为下一次抓取操作做准备这又需要调用AP中的ReleaseDC函数GetDC函数功能获取指定窗口的设备场景其格式为GetDChwnd参数hwnd为将要获取的设备场景的窗口句柄若为0则要获取整个屏幕的DC。
此函数获取的场景必须用ReleaseDC函数释放。
ReleaseDC函数释放由GetDC函数和GetWindowDC函数获取的指定设备场景。
其格式为ReleaseDChwndhdc。
参数hwnd指出要释放的设备场景相关的窗口句柄hdc指出要释放的设备场景的句柄。
3.3实现
代码标准模块中AP函数的声明OptionExplicitGetC函数声明eclareFunctionGetCLibuser3ByValhWndAsLongAsLongReleaseC函数声明eclareFunctionReleaseCLibuser3ByValhWndAsLongByValhCAsLongAsLongBitBlt函数声明PubliceclareunctionBitBltLibgdi32ByValhestCAsLongByValxAsLongByValyAsLongByValnWidthAsLongByValnHeightAsLongByValhSrcCAsLongByValxSrcAsLongByValySrcAsLongByValdwRopAsLongAsLong2“抓图”菜单事件
代码PrivateSubmCopyScreen_ClickimhCAsLongsxAsntegersyAsnteger隐藏窗体执行事件Me.Hideovents设置picCopy图片框控件高度、宽度为屏幕高度、宽度picCopy.WidthScreen.WidthpicCopy.HeightScreen.HeightpicCopy.AutoRedrawTrue获取整个屏幕场景句柄hCGetC0获取抓取区域整个屏幕的像素值sxScreen.WidthScreen.TwipsPerPixelXsyScreen.HeightScreen.TwipsPerPixelY以屏幕00为左上角长度和宽度分别为sxsy的区域图形复制到piccopy控件中BitBltpicCopy.hDC00sxsyhDC00vbSrcCopy释放句柄ReleaseDC0hDC8232ComputerKnowledgeandTechnology电脑知识与技术软件
设计开发本栏目责任编辑谢媛媛第6卷第29期2010年10月上接第8230页其中Zg表示该课程的周学时数Jg表示课程级别选修课的课程级别设置为1必修课的课程级别设置为2Rg表示该课程的参与人数T1、T2、T3是可以调整的参数。
由式1可以看出课程级别越高、周学时越多、参加人数越多的课程其Lg值越大其优先级也越高反之Lg值越小其优先级越低。
这样就可以根据计算的优先级的高低对课程进行排序优先级高的优先排课。
3查询可用时间单元首先初始化某门课程的最大可安排时间数组为123456123456123456123456123456。
然后找出参加该课程学习的所有班级。
第3步
查询每个班级的时间数组得到班级的已排课时间并将其与
课程的最大时间数组相“与”从而得到该课程不能安排的时间单元。
第4步依次处理教师时间数组和相关教室时间数组这样该课程最终的可安排时间数组就是班级、教师、教室可排课时间的交集。
4查找适当的时间模式找到可排课时间后就应根据课程的周学时数在时间模式库中匹配适当的时间模式。
以上排课
工作完成后就确定了课程的上课时间和地点。
在处理中如果发生死锁则可根据回溯法的思想向上回溯搜索到发生冲突的最近一个记录对它进行重排以解决死锁如果死锁问题仍不能解决则将该课程信息输出到冲突
列表中。
5人工干预的处理计算机自动排课也需要进行人工干预以便各个高校根据自己的具体要求设置和调整排课算法中的一些参数而且可以对计算机排出的课表进行手动调整。
人工干预主要包括以下几个方面等价类划分中参数的设置教室类型的设置时间模式库的设置优先级函数中参数的设置。
用户可以根据自己的具体要求对这些参数和库进行设置。
另外对于
计算机排出的课程表用户也可以通过手动进行适当调整使得课程表能够满足用户的需要。
3结束语在自动排课系统设计过程中排课算法的设计是关键所用排课算法直接影响了系统的可行性。
此排课算法经验证是可行的通过不同阶段采用不同的算法充分发挥了各算法的优点使实现自动排课成为可能。
参考文献1钱德凤.TTP在高校排课中的研究与应用D.上海:上海师范大学2006:10-11.2湛德照.高校自动排课系统的算法研究与实现D.重庆:重庆大学2006:15-17.3陈雪芳.教学
管理系统中排课算法约束条件及其实现J.东莞理工学院学报20091:51-54.4李明.一个基于智能化
搜索的排课表算法及其Client/Server实现J.现代计算机19976.5李增智王云岚陈靖.课程表问题的一种混合型模拟退火算法J.西安交通大学报2003374.6杨为民.使用遗传算法编排课程表的研究与应用D.合肥:安徽大学2003:20-23.picCopy.AutoRedrawFalseSetPictureMe.ShowEndSub4用API函数时应注意的
问题调用API函数时稍有不慎就可能导致API编程错误出现难于捕获或间歇性错误甚至出现程序崩溃。
为更好地利用API函数应注意下列问题1指定“OptionExplicit”以避免变量隐式声明带来的弊端2勿忘ByVal确保函数声明的完整性3注意检查参数类型4跟踪检查参数、返回类型和返回值5对要求一个指向缓冲区的指针以便从中载入数据的API函数应预先初始化字符串以免造成冲突。
5结束语
VB以友好易学的可视化开发环境闻名于世可以完成几乎所有Windows应用程序的编写是人们
学习计算机编程的首选语言。
但是要开发具有专业水准的Windows应用程序必须使用大量的API函数使
VB能够直接控制和处理计算机的系统参数和硬件资源。
在本实例中通过GetDC获取屏幕场景句柄应用BitBlt函数的SRCOPY光栅运算可直接将整个屏幕内容复制于图片框中并作为位图文件加以保存。
那么如果用户想随心所欲实现区域获取就需要更多API函数的支持如GetCursorPos函数等。
另外通过对BitBlt函数功能的挖掘抓屏、图形变换、智力拼图等程序都将轻松实现。
参考文献1宋伟吴建国.VisualBasic6.0高级编程M.北京:清华大学出版社2002.2李春争.WindowsAPI编程范例入门与提高M.北京:清华大学出版社2003.82