Visual-Basic程序设计课件第10章 WINDOWS API应用基础_第1页
Visual-Basic程序设计课件第10章 WINDOWS API应用基础_第2页
Visual-Basic程序设计课件第10章 WINDOWS API应用基础_第3页
Visual-Basic程序设计课件第10章 WINDOWS API应用基础_第4页
Visual-Basic程序设计课件第10章 WINDOWS API应用基础_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10.1WindowsAPI与DDL

WindowsAPI是WindowsApplicationProgrammingInterface的简称,中文为“应用程序接口”,它包含成千上万的函数、例程、类型和常数定义,包含在不同的动态链接库DLL文件中,可以提供在Windows操作系统下不同开发语言共享调用。MicrosoftWindows本身就是由若干个DLL组成的,其它应用程序可以调用这些库中的过程,完成窗口与图形的显示、内存管理或其他任务。这些过程有时被称为WindowsAPI,或应用程序接口。表10-1列出部分常用的操作系统环境库的DLL文件。表10-1常用的操作系统环境库的DLL文件动态链接库描述Advapi32.dll高级API服务,支持大量的API(其中包括许多安全与注册方面的调用)Comdlg32.dll通用对话框API库Gdi32.dll图形设备接口API库Kernel32.dllWindows32位核心的API支持Lz32.dll32位压缩例程Mpr.dll多接口路由器库Netapi32.dll32位网络API库Shell32.dll32位ShellAPI库User32.dll用户接口例程库Version.dll版本库Winmm.dllWindows多媒体库如果需要使用MicrosoftVisualBasic核心语言和控件未包含的功能,例如:读写系统注册表、实现屏幕拷贝等功能,这些功能VisualBasic本身没有提供。对VisualBasic内部未提供的功能,可以考虑使用调用API函数或过程(以下均称为过程)实现,即可以直接调用包含在动态链接库DLL中的API过程。通过DLL可以访问构成MicrosoftWindows操作系统主体的成千上万个过程,还可以使用其它语言编写的各种例程。10.1.2DLL函数或过程的声明

WindowsAPI的过程是用C语言编写的,在VisualBasic中使用它们之前,必须先进行声明。一般语法如下:(1)要声明一个DLL过程,需要在代码窗口的“声明”部分增加一个Declare语句。如果该过程返回一个值,应将其声明为Function,即:DeclareFunction函数名Lib"库名"[Alias"别名"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]AsType其中:1)Variable为变量名,type为变量类型或返回值类型。2)Lib"库名"表示包含函数或过程的.dll文件位置。如果引用的过程属于Windows核心库(User32、Kernel32或GDI32),可以不包含文件扩展名,例如:DeclareFunctionGetTickCountLib"kernel32"Alias"GetTickCount"()AsLong3)对于其它DLL,Lib子句指定文件的路径,即:DeclareFunctionAFuncLib"C:\AA.dll"(ByValSAsInteger,ByValDAsInteger)AsLong4)如果未指定libname的路径,VisualBasic将按照下列顺序查找该文件:.Exe文件所在的目录

当前目录

Windows位系统目录(通常为\Windows\System)

Windows目录

Path环境变量中的目录。(2)如果过程没有返回值,可将其声明为Sub,即:

DeclareSub过程名Lib"库名"[Alias"别名"][([[ByVal]variable[Astype][,[ByVal]variable[Astype]]...])]

通过在VisualBasic应用程序中声明外部过程,能够访问WindowsAPI(以及其它的外部DLL)。声明过程后,调用方法与VisualBasic的过程相同10.2使用ApiView声明API函数或过程

DLL过程的声明是比较复杂的。尽管可以自己进行声明转换,最简单的办法是使用VisualBasic提供的预定义WindowsAPI声明,这些声明包含在VisualBasic安装目录下的\Winapi\Win32api.txt文件中,要使用该文件中的函数、类型等定义时,将所需要内容从该文件复制到VisualBasic模块中即可。查看并复制Win32api.txt中的过程,可以直接在记事本中打开,通常使用VisualBasic开发环境外接程序管理器中的APIViewer应用程序进行查看和使用。APIViewer应用程序的步骤如下:第1步:加载APIViewer应用程序。在菜单栏上选择“外接程序→外接程序管理器”选项,弹出“外接程序管理器”对话框,选择“VB6APIViewer”并选中“加载/卸载”复选框,如图10-1所示;单击“确定”按钮后,在“外接程序”菜单中将看到“API浏览器”菜单项。图10-1外接程序管理器

第2步:加载API声明文件。在菜单栏上选择“外接程序→API浏览器”选项,打开“API浏览器”窗口。在菜单栏上选择“文件→加载文本文件”选项,如图10-2所示;在弹出的“选择一个文本API文件”对话框中选择名称为“Win32Api.txt”的文本文件,单击“打开”按钮。完成本步骤后,将看到API浏览器中“可用项”列表框中列出了常用的API声明,如图10-3所示。图10-2加载API声明文件

第3步:添加需要的API过程。在图10-3所示的“API浏览器”中选择“API类型”为声明,通过滚动条选择所需要的API过程,例如SetWindowTextAPI过程,该过程实现修改窗体的标题栏的功能(当然,在VB中修改窗体的标栏设置其Caption属性更加简单,这里只是为了说明添加过程)。天价后,单击“插入”按钮,弹出提示信息对话框,如图10-4所示。单击“是”按钮,完成添加。图10-3添加SetWindowTextAPI过程到窗体的代码文件注意:如果要将API过程添加到窗体的代码文件中,必须选择“声明范围”为“私有”;如果添加到标准模块中,可以选择“公有”和“私有”;如果在标准模块也选择私有,则该过程只能在该模块中使用,反之,可以在项目的任何位置使用。第4步:使用API过程。打开窗体代码,可以看到插入的API声明部分:

PrivateDeclareFunctionSetWindowTextLib"user32"Alias"SetWindowTextA"(ByValhwndAsLong,ByVallpStringAsString)AsLong

该过程功能是实现设置窗体的标题栏文字,需要两个参数:参数1:窗体句柄,在VB中就是Me.hwnd

参数2:设置到窗体标题栏的字符串在窗体上添加一个命令按钮Command1,并为其Click事件添加如下代码:

PrivateSubCommand1_Click()SetWindowTextMe.hwnd,"API函数使用"EndSub

学习API过程的使用,不需要开始就学习每一个过程如何使用,而是在程序开发过程中遇到什么方法的问题,才去查找相应方面API过程的参考资料;学习API的过程也是不断积累的过程。网上资源或书籍有很多关于API过程学习的资料,可以直接参考其范例中的声明部分。10.3API过程使用案例

10.3.1案例:获取计算机的名称

[例10-1]获取计算机的名称,如图10-5所示。图10-5运行结果

[分析]可以使用GetComputerName的API过程获取计算机的名称,该过程可以通过前面介绍的添加“API浏览器”方法,在“API浏览器”对话框中找到该过程的声明,再插入到当前窗体,然后象使用一般过程的方法调用该过程。[建立工程]1.新建窗体,添加一个命令按钮。2.参见图10-1~图10-3,在菜单栏上选择“外接程序→API浏览器”选项,加载API文本文件后,在列出的“可用项”中找到GetComputerName(可以输入GetComputerName前面几个字母,“可用项”中将快速跳到以此开头的过程),如图10-6所示。图10-6添加API过程声明3.使用GetComputerName过程打开窗体代码文件,可以看到加入到代码中的声明部分:

PrivateDeclareFunctionGetComputerNameLib"kernel32"Alias"GetComputerNameA"(ByVallpBufferAsString,nSizeAsLong)AsLongGetComputerName过程需要两个参数:参数1lpBuffer是字符串,保存取得的计算机名称,必须在调用该过程前,定义字符串有足够保存名称的长度;参数2nSize是以地址传递方式传递的数字,指定lpBuffer字符串的长度,同时,过程调用结束时,该参数是实际获取的计算机名称的长度。[程序代码]在窗体中,为命令按钮Command1的Click事件编写以下代码,以调用该过程:PrivateSubCommand1_Click()DimstrNameAsString,NameLenAsLongNameLen=250strName=String(NameLen,vbNullChar)GetComputerNamestrName,NameLenMsgBox"你的计算机名称是:"&Left(strName,NameLen)EndSub其中,vbNullChar为Vb中的空字符常数,相当于二进制的0;vbNullString为VB中的空字符串。注意:调用

API过程时,参数类型必须与声明的一致。本例中,如果实际计算机名称不超过250个字符(250是足够长的长度数),则字符串strName其余储存空间将被填充为不可显示的字符串结束标记。因此,用Left系统函数取得实际的计算机名称长度内容。一般,如果API过程将改变字符串参数的内容,必须定义该字符串变量有足够的长度,也可以定义为定长字符串,如DimstrNameAsString*250;如果API过程只是读取该参数,而不需要修改该参数,可以使用字符串常数,或非定长字符串变量并预先进行赋值。思考:设置计算机名称的API过程声明如下:PrivateDeclareFunctionSetComputerNameLib"kernel32"Alias"SetComputerNameA"(ByVallpComputerNameAsString)AsLong如何使用该过程改变计算机名称?10.3.2案例:播放WAV声音文件[例10-2]播放WAV声音文件。[分析]许多人都使用过即时通讯软件QQ,每当新信息到达时,QQ会发出“滴滴滴”的声响。实际上,这声音文件来自QQ安装目录下的Sound文件夹中的msg.wav文件。VB没有直接提供播放Wav声音文件的系统函数,可以用API函数sndPlaySound来实现该功能。参照例10-1中添加API过程的方法,在当前窗体中添加sndPlaySound的API过程声明,该声明为:PrivateDeclareFunctionsndPlaySoundLib"winmm.dll"Alias"sndPlaySoundA"(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong

以上过程中,参数1lpszSoundName需要指定Wav文件的位置,如果为VbNullString(VB中的空字符串),则停止声音的播放;参数uFlags是播放标记常数,该常数必须进行声明,其值可能是以下的几种:PrivateConstSND_SYNC=&H0'playsynchronously(default)PrivateConstSND_ASYNC=&H1'playasynchronouslyPrivateConstSND_LOOP=&H8'loopthesounduntilnextsndPlaySound在“API浏览器”中加载API文本文件后,“选择“API类型”为“常数”,可以看到以SND_开头的一组符号常数,选择上面三个值添加到当前窗体代码中。SND_SYNC的含义:同步调用,程序必须等到声音播放完毕,才继续往下执行;SND_ASYNC的含义:异步播放,播放声音时,程序继续往下执行;SND_LOOP的含义:循环播放。如果要停止播放,设置sndPlaySound过程的参数1为VbNullString即可。[建立工程]

在窗体上添加两个按钮,名称默认为Command1(开始播放)和Command2(停止播放),界面布局如图10-7所示。图10-7界面布局[程序代码]1 PrivateDeclareFunctionsndPlaySoundLib"winmm.dll"Alias"sndPlaySoundA"_(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong2 PrivateConstSND_SYNC=&H0'playsynchronously(default)3 PrivateConstSND_ASYNC=&H1'playasynchronously4 PrivateConstSND_LOOP=&H8'loopthesounduntilnextsndPlaySound5 6 PrivateSubCommand1_Click()7 sndPlaySound"c:\msg.wav",SND_ASYNC8 EndSub9 10 PrivateSubCommand2_Click()11 sndPlaySoundvbNullString,012 EndSub[代码说明]行1~4:通过“API浏览器”添加的声明部分。行6~8:开始播放声音。注意,调试该例子时,必须实际存在C:\msg.wav文件,或替换其他任何存在的wav文件。行11:停止声音的播放。10.3.3案例:截取屏幕到Picture控件显示[例10-3]截取屏幕到Picture控件显示。[分析]截取屏幕相当于在键盘按下“PRTSCSYSRQ”键,然后粘贴到“画图”程序中得到屏幕的图像。如果要在VB中实现该功能,需要借助GetDC的API过程获取屏幕区域,然后用BitBltAPI过程将图象绘到指定的设备,如Picture或窗体上;捕捉图象完毕,需要使用ReleaseDCAPI过程释放资源。[建立工程]首先用“API浏览器”添加三个API的过程声明:(1)PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong该过程取得目标绘图区域的Handle,相当于指向该区域的指针。GetDC过程需要hwnd参数,如果该参数为0,表示取得屏幕区域;如果是控件的hwnd,则为控件区域。例如,窗体的hwnd即Me.Hwnd,则取得窗体区域。(2)PrivateDeclareFunctionReleaseDCLib"user32"(ByValhwndAsLong,ByValhDCAsLong)AsLong与GetDC对应的过程,调用GetDC完成处理后,要释放所占用的DC资源。(3)PrivateDeclareFunctionBitBltLib"gdi32"(_ByValhDestDCAsLong,_ByValxAsLong,_ByValyAsLong,_ByValnWidthAsLong,_ByValnHeightAsLong,_ByValhSrcDCAsLong,_ByValxSrcAsLong,_ByValySrcAsLong,_ByValdwRopAsLong)AsLong该过程参数看上去相当复杂,但理解每个参数含义后,使用也是比较简单的;其功能是:将来源区域的图像按照dwRop方式绘制到目标区域中。注意:分行符前必须有空格。参数说明如下:参数1hDestDC:目标区域的DC,在VB中,即控件的hDC属性。在VB中,具有该属性的控件只有窗体和Picture,因此,将图像绘制到这两个控件的任何一个(其他控件没有hDC属性,但可以通过GetDC获取)。参数2,3,4,5:目标区域的绘图起点和宽度、高度。参数6hSrcDC:来源区域的hDC,可以通过GetDC获取,如果是屏幕,则使用GetDC(0)取得。参数7,8(xSrc,ySrc):指定源区域的起点。参数9dwRop:将来源图像绘制到目标区域的方式,其中,vbSrcCopy直接将图像从来源拷贝到目标,其他方式大部分是来源区域图像与目标区域图像叠加产生的各种效果,其含义参见表10-1的描述。表10-1绘图方式dwRop常数常数值描述vbDstInvert&H00550009反转目标位图vbMergeCopy&H00C000CA合并模式和源位图vbMergePaint&H00BB0226用Or运算合并反转的源位图和目标位图vbNotSrcCopy&H00330008将反转的源位图复制到目标vbNotSrcErase&H001100A6用Or运算合并源位图和目标位图,然后反转vbPatCopy&H00F00021L将模式复制到目标位图vbPatInvert&H005A0049L用Xor运算合并目标位图与模式vbPatPaint&H00FB0A09L用Or运算合并反转的源位图与模式。然后用Or运算合并上述结果与目标位图vbSrcAnd&H008800C6用And运算合并目标像素与源位图vbSrcCopy&H00CC0020将源位图复制到目标位图vbSrcErase&H00440328反转目标位图并用And运算合并所得结果与源位图vbSrcInvert&H00660046用Xor运算合并目标像素和源位图vbSrcPaint&H00EE0086用Or运算合并目标像素和源位图1 PrivateDeclareFunctionGetDCLib"user32"(ByValhwndAsLong)AsLong2 PrivateDeclareFunctionReleaseDCLib"user32"(_ ByValhwndAsLong,ByValhDCAsLong)AsLong3 PrivateDeclareFunctionBitBltLib"gdi32"(_ ByValhDestDCAsLong,_ ByValxAsLong,_ ByValyAsLong,_ ByValnWidthAsLong,_ ByValnHeightAsLong,_ ByValhSrcDCAsLong,_ ByValxSrcAsLong,_ ByValySrcAsLong,_ ByValdwRopAsLong)AsLong4 PrivateDeclareSubSleepLib"kernel32"(ByValdwMillisecondsAsLong)5 6 PrivateSubPicture1_Click()7 Me.Visible=False8 DoEvents9 Sleep(100)10 [程序代码]11

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论