版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
29章使用WindowsWindowsAPIWindowsWindows应VBAWindowsAPIOfficeWindowsAPI代码进入操作系统。要在Excel中调用API函数,需要先了解API及其相关知识。WindowsAPIAPIApplicationProgrammingInterface,WindowsAPI也就是Windows使用这些API函数可以像搭积木一样Windows环境下的应用程序。但是,如果全部使用API函数进行应用程序开发,程序员就必须熟记一大堆常用的API函数,而且还得对Windows操作系统有深入的了解。这样,程序的开发效率将很低。Windows平台上出现了很多优秀的可视化编程环境,程优秀的可视化编程环境操作简单、界面友好(VB、VisualC++、DELPHI等),在这API的神秘功能,事实上这些类库和WindowsAPIAPI函数的集合。它们把常用API函数组合在一起成为一个控件或类库,并赋予其方便的使用方法,所以极大地提高Windows应用程序的开发效率。有了这些控件和类库,程序员便可以把主要精力放在程用API函数来实现。应用程序同样也可调用API函数,以扩充应用程序的功能APIWindowsWindowsAPI提供的函数,通过这些函数可以保证所有在Windows中运行的应用程序都按照统一的方式运行。WindowsAPI函数包含在一系列扩展名为DLL的动态库文件中共有上千个API函数。对于数量众多的API函数,开发者不必刻意去研究每个API函数的用法,但是在需要的时候,至少应该知道它属于哪一类的API函数,这样才能正确查找和使用。按照通常的划分标准,WindowsAPI7API函数向应用程序提供了一些创建和管理用户界面的方法,窗体通用控制类:系统S 众不同的外观,通用控制是由通用控制库COMCTL32.DLL提供的。 图形设备接口(GDI32):提供绘图、图形处理、使用显示设备等一系列 国际特性类:有助于编写的应用程序,提供Unicode字符集和多语种支持过查看API帮助掌握其使用方法即可。WindowsAPI提供的函数,使用VBA可以利用Windows操作系统的强大功能,VBAAPI的使用方法,使读者掌握使用API的方法。VBA可以调用动态库(DLL)中的函数。在大多数情况下,这些DLL文件是由CC++VBA中调用这些函数时,需要进行一些特殊设置,使其能与C的数据类型进行数据交换。本节介绍具体的设置方法。使用VBA的Declare语句,可在模块级别中对动态库(DLL)中外部过程。Declare[Public|Private]DeclareSubnameLib"libname"[Alias"aliasname"][Public|Private]DeclareSubnameLib"libname"[Alias"aliasname"][Public|Private]DeclareFunctionnameLib"libname"[Alias[([arglist])][As 语句的语法包含下面几部分的内容Private:用于只能在包含该的模块中使用的过程Name:任何合法的过。注意动态库的名称区分大小写lias:表示将被调用的过程在动态库(DLL)中还有另外的名称。当外部过与某个关键字重名时,就可以使用这个参数。当动态库的过程与同一范围内的公用变量、常数或任何其他过程的名称相同时,也可以使用lia用a。则aliasname是动态库中该过程的处的名称。如果首字符是(#),则随arglist:代表调用该过程时需要传递的参数的变量表type:FunctionByte、Boolean、Integer、Long、Currency、Single、Double、Date、String(只支持变长)Variant的用户定义类[Optional][ByVal|ByRef][ParamArray]varname[()][As 是可选的,而且必须都使用Optional关键字。如果使用了ParamArray,则任何参数都不能使用Optional。ByValByRef:表示该参数按地址传递。ByRefVBA关键字不能与ByVal、ByRef或Optional一起使用。typeByte、Boolean、Integer、Long、Currency、Single、Double、Date、String(只支持变长)、Object、Variant的用户ByValByVal,VBA运行时错误以方式传递参数会将该参数的内存地址传递给被调用的过程。如果被调用的过程由于以方式传递参数可以在内存中修改参数值,因此如果不正确地以方式传递参数,API函数可能会改写它不应该写入的内存,从而导致错误或其他一些难以预料的结果。Windows中有很多不应该被改写的值。例如,Windows给每个窗体分配一个唯一的称为“句柄”的32位标识符。注意:当所调用的外部过程需要一个值为0的字符串时,就要使用vbNullString常数。该API函数还需要定义它用到的常量及类型。应将常量、用户自定义类型的定义,与要使用它们的函数的Declare语句一起放在模块的部分。从API的相关文档可以找有时可能需要向函数传递常量,以指明要求该函数返回何种信息。例如,GetSystemMetrics函数,在程序中不必包含所有75个常量,只包含要使用的那些常量即可。使用API从前面的介绍可知,在使用API函数之前,必须先API函数,另外,API函数中的很多参数使用预定义的结构和常数。API(包括结构、常数)必须放在窗体或模块的“通用”(General)段API函数部分看起来就觉得很复杂,并且对字符需要区分大小写。API函数的声下,可直接从API浏览器中过来,这样可以避免出现错误。下面以VB6开发环境中提供的API浏览器为例,介绍查询的方法。VB6中单击主菜单【外接程序】|【API浏览器】命令(在图29-1所示框中还未显示任何内容,需要先载入相应的API文件。单击菜单【文件】|【文本文件】命令,打开如图29-2所示框,选择WIN32API.TXT,并单击【打开】按钮将该文件加载到API浏览器窗体中。图29-1【API浏览器】窗 图29-2加载文本文在【API类型】下拉列表框中可以选择,然后在下面的文本框中输入部分字flash,在【可用项】列表框中将显示匹配的内容。在【可用项】列表框中双击API函数FlashWindow,该项的详细内容将添加到下方的【选定项】列表框中,如图29-3所示。29-3API函数调用APIUSER.DLL动态库中包含一个API函数FlashWindow,使用该函数可将指定的窗API函数的使用方法。本例需要使用以下两个API函数:FlashWindowPrivatePrivateDeclareFunctionFlashWindowLib"user32"(_ByValhWndAsLong,ByValbInvertAsLong)AshWndVBA中,没有属性可以直接返回窗体的句柄,所以还需要使用FindWindow函数查询窗体的句柄。PrivatePrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsLong,ByVallpWindowNameAsString)As0。API函数的作用、参数以后,就可以在ExcelVBA中开始编写代码。具体单击菜单【插入】|【用户窗体】命令,向工程中增加一个用户窗PrivatePrivateDeclareFunctionFlashWindowLib"user32"(_ByValhwndAsLong,ByValbInvertAsLong)AsPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(ByVallpClassNameAsLong,ByVallpWindowNameAsString)As在用户窗体中,必须将其改为Private。DimhWndAs '保存当前窗体的句 PrivateSubUserForm_Initialize()hWndPrivateSubUserForm_Initialize()hWnd=FindWindow(0&,"UserForm1")EndFindWindow函数查找用户窗体的句柄时,因窗体标题比较容易获得,所以省略了窗体类的名称,直接传递一个长整型的0给函数。PrivatePrivateSubcmdFlash_Click()Fori=1To100CallFlashWindow(hWnd,True)CallFlashWindow(hWnd, '使窗体处于活动状End29-4在VBE中,通过单击菜单【插入】|【用户窗体】命令向工程中插入的用户窗体是一只有通过API函数才能完成任务。要实现半透明窗体的效果,需要使用多个API函数,下面简单介绍这些APISetLayeredWindowAttributesPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValhWndAsLong,ByValcrKeyAsLong,ByValbAlphaAsByte,_ByValdwFlagsAsLong)AsLongbAlpha:是,取值范围是dwFlags:是透明方式,可以取以下两颜色为crKey的地方将变为透明。提示:要使窗体拥有透明效果,首先要使用以下语句定义 常量WS_EX_LAYERED= GetWindowLong(ByValhWndAsLong,ByValnIndexAsLong)AsLongGWL_EXSTYLE:得到扩展的窗体风GWL_STYLE:得到窗体风格CallWindowProc函数来调用;GWL_HINSTANCE:得到应用程序运行实例的句GWL_HWNDPARENT:得到父窗体的GWL_ID:得到窗体的标识符GWL_USERDATA32位的值(每一个窗体都有一个有意留给创建窗体的应用程序使用的32位的值)。GetWindowLong函数得到扩展的窗体风格(GWL_SetWindowLong函GetWindowLong函数对应,SetWindowLong函数用来修改给定窗体的一个属性。(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)As了解以上API函数后,就可以在VBE中开始制作透明窗体了。具体步骤如下单击菜单【插入】|【用户窗体】命令,增加一个用户窗体。向用户窗体中添 29-5(ByValhWndAsLong,ByValnIndexAsLong)AsLong(ByValhWndAsLong,ByValnIndexAsLong,ByValdwNewLongAsLong)AsPrivateDeclareFunctionSetLayeredWindowAttributesLib"user32"_(ByValhWndAsLong,ByValcrKeyAsLong,ByValbAlphaAsByte,_ByValdwFlagsAsLong)AsLongPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLongPrivatePrivateConstWS_EX_LAYERED=&H80000PrivateConstGWL_EXSTYLE=(-20)PrivateConstLWA_ALPHA=&H2PrivatePrivateConstLWA_ALPHA=&H2PrivateConstLWA_COLORKEY=&H1在窗体的初始化中编写以下代码,调用 函数完成透明窗体的设置PrivateSubUserForm_Initialize()DimrtnAsLong,hWndAsLonghWndPrivateSubUserForm_Initialize()DimrtnAsLong,hWndAsLonghWnd=FindWindow(0&,Me.Caption)rtnGetWindowLong(hWnd,GWL_EXSTYLE)获取扩展属性rtn=rtnOrWS_EX_LAYEREDSetWindowLonghWndGWL_EXSTYLE SetLayeredWindowAttributeshWnd0100LWA_ALPHAEndSetLayeredWindowAttributesbAlpha0,窗体将完全透明,处于看不见的状态。设置参数bAlpha为255,窗体将不透明(与正常窗体一样)。29-629-7CreateEllipticRgnPrivateDeclareFunctionCreateEllipticRgnLib"gdi32"( ByValByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsAs提示:该函数创建的区域在不用时一定要用 函数删除DeleteObjectPrivatePrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLongSetWindowRgn函PrivatePrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)As了解以上API函数后,就可以在VBE中开始制作椭圆窗体了。具体步骤如下单击菜单【插入】|【用户窗体】命令,增加一个用户窗体。向用户窗体中添 个、2个文字框、2个按钮,设置用户窗体及控件的属性,得到如图29-8所示窗体29-8提示:PrivatePrivateDeclareFunctionCreateEllipticRgnLib"gdi32"(ByValX1AsLong,ByValY1AsLong,ByValX2AsLong,ByValY2AsLong)AsLongPrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsPrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLongPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLong在窗体的初始化中编写以下代码,调用 函数完成椭圆窗体的设置PrivateSubUserForm_Initialize()DimrgnAsLong,hWndAsLonghWndPrivateSubUserForm_Initialize()DimrgnAsLong,hWndAsLonghWnd=FindWindow(0&,Me.Caption)rgnCreateEllipticRgn(0,0Me.Width,Me.Height创建椭圆SetWindowRgnhWnd,rgn,TrueCallEndSetWindowRgnCreateEllipticRgn函数创建SetWindowRgn函数将窗体剪切为SetWindowRgn函数进行设置即可。要绘制不规则区域,可使用API函数CreatePolygonRgn,该函数原型如下PrivatePrivateDeclareFunctionCreatePolygonRgnLib"gdi32"(lpPointAsPOINTAPI,ByValnCountAsLong,ByValnPolyFillModeAsLong)AsLonglpPoint:为POINTAPI类型的变量。POINTAPI是一个用于描nPolyFillMode:描述多边形填充模式。可为ALTERNATE或WINDING常数。单击菜单【插入】|【用户窗体】命令,增加一个用户窗体。向用户窗体中添 图29-9原始的【不规则窗体】PrivatePrivateDeclareFunctionSetWindowRgnLib"user32"(ByValhWndAsLong,ByValhRgnAsLong,ByValbRedrawAsBoolean)AsPrivateDeclareFunctionFindWindowLib"user32"Alias"FindWindowA"(_ByVallpClassNameAsLong,ByVallpWindowNameAsString)AsLongPrivateDeclareFunctionCreatePolygonRgnLib"gdi32"(lpPointAsPOINTAPI,ByValnCountAsLong,ByValnPolyFillModeAsLong)AsLongPrivateDeclareFunctionDeleteObjectLib"gdi32"(ByValhObjectAsLong)AsLong类型来表示。在部分编写以下代码创建该自定义类型:PrivatePrivateTypePOINTAPIxAsLongyAsEnd使用这些坐标数组绘制一个多边形,SetWindowRgn函数使用该多边形设置窗体的外形,PrivateSub DimDimhWndAsLong,ResultAsLongDimP(5)AsPOINTAPIP(0).x=P(0).y=P(1).x=P(1).y=P(2).x=Me.Width-50P(2).y=Me.Height-50P(3).x=Me.Width-100P(3).y=Me.HeightP(4).x=0P(4).y=Me.Height/Result=CreatePolygonRgn(P(0),5,hWnd=FindWindow(0&,Me.Caption)'查找窗体句柄SetWindowRgnhWnd,Result,True'改变窗体区域CallDeleteObject(Result) End图29-10创建好的【不规则窗体】提示:在 中调整窗体的原始大小,可得到形状不同的不规则窗体VBAWindowsAPI函数来获取系统GlobalMemoryStatus函数可获得当前可用的物理和虚拟内存信息,该函数原型PublicPublicDeclareSubGlobalMemoryStatusLib"kernel32"(lpBufferAs类型MEMORYSTATUS的定义如下:PublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFilePublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFileAsLongdwAvailPageFileAsLongdwTotalVirtualAsLongdwAvailVirtualAsLongEnddwLength:MEMORYSTATUS结构的大小,在调用GlobalMemoryStatus函数前dwMemoryLoad0~100之间的值,用来指示当前系统内存的使dwTotalPhys:返回总的物理内存大小,以字节(B)为单dwAvailPhys:返回可用的物理内存大小,以字节(B)为单位dwAvailPageFile:返回可用的页面文件大小,以字节(B)为单位GlobalMemoryStatusExcel中编写函数来获取内存的状态单击菜单【插入】|【模块】命令,向工程中插入一个模块在模块的部分粘贴API函数的定义如下PublicPublicDeclareSubGlobalMemoryStatusLib"kernel32"(lpBufferAsPublicPublicTypeMEMORYSTATUSdwLengthAsLongdwMemoryLoadAsLongdwTotalPhysAsLongdwAvailPhysAsLongdwTotalPageFileAsdwAvailPageFiledwAvailPageFileAsLongdwTotalVirtualAsLongdwAvailVirtualAsLongEndDimMemStatAsPrivatePrivateSub内存信息Dimstr1AsString,tempAsSingleMemStat.dwLength=Len(MemStat)tempRound(MemStat.dwTotalPageFile102410242)str1="物理内存:"&temp&"MB"&vbNewLinetemp=Round(MemStat.dwAvailPhys/1024/1024,2)str1=str1&"可用内存:"&temp&"MB"&vbNewLinetempRound(MemStat.dwTotalPageFile102410242)str1=str1&"虚拟内存:"&temp&"MB"&vbNewLinetempRound(MemStat.dwAvailPageFile102410242)str1=str1&"可用虚拟内存:"&temp&"MB"MsgBoxstr1vbOKOnly内存信息End图29-11【内存信息】VBA中,没有提供获取键盘状态的函数。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度南京二手房交易税费减免政策咨询合同
- 二零二五年度农田租赁与农业金融服务合同样本
- 2025年度瓶装纯净水原水采集与处理合同4篇
- 2025年度门面房屋租赁合同租赁双方信息保密协议4篇
- 2025年度海洋工程技术服务合同协议范本3篇
- 民政局二零二五年度离婚协议书电子模板使用许可4篇
- 二零二五版金融信息服务合同4篇
- 2025年度个人店面租赁合同范本简易版2篇
- 2025年度个人房产买卖合同法律咨询协议2篇
- 2025年度个人网络安全与隐私保护咨询服务合同范本3篇
- 医院急诊医学小讲课课件:急诊呼吸衰竭的处理
- 肠梗阻导管在临床中的使用及护理课件
- 调料厂工作管理制度
- 2023年MRI技术操作规范
- 小学英语单词汇总大全打印
- 卫生健康系统安全生产隐患全面排查
- GB/T 15114-2023铝合金压铸件
- 三相分离器原理及操作
- 货物验收单表格模板
- 600字A4标准作文纸
- GB/T 18015.2-2007数字通信用对绞或星绞多芯对称电缆第2部分:水平层布线电缆分规范
评论
0/150
提交评论