易语言 Windows API 入门详解
易语言 Windows API 入门详解
序言
看到论坛上有很多新手朋友对API都不懂怎么使用,做为一个Windows 编程爱好者,如果不会用Windows系统提供给我们的编程接口,那将是一件非常遗憾的事,鉴于此,本文作者以自身体会为基础,
结合易语言实例,深入浅出的讲解API在易语言中的使用,希望对新手朋友有所帮助;
什么叫API?
API全称为Application Programming interface,直译的话可叫它“应用程序接口”。它是Windows开放给程序员的编程接口,使得在用户级别下可以对操作系统进行控制,也就是一般的应用程序都需要调用API来完成某些功能,API说到底就是一系列的函数,我们可以把它理解为程序的子程序或
子过程,只不过它是系统本身提供给用户在进行高级编程中供其程序使用的开放函数。
API能做什么?它起什么作用?
我们编写的程序通过调用它来达到操作系统的目地,它是系统提供给我们的编程接口,一个很经典的
例子就是我们要通过调用API函数ExitWindowsEx来关闭系统,它还为各编程语言间的融会贯通架起了桥
梁。
我怎样才知道我要的功能可以用某个API实现?
当你要实现的功能与系统的功能有关时都尽量假设可以用API办到,首先你要知道一些常用的API的功
能,下面有提供一个API的文档,你可以浏览地看一下,以后程序要实现某功能你可以在里面找,另外,互联
网上是一个无限的知识库,你可以问必应(www.bing.com),问Google,另外微软还提供了一个知识库叫"MSDN",你也可以查看。
易语言调用 Windows API 教程
要全面了解和使用API,我们先应该了解下动态链接库(DLL)的调用机制,因为API其实就是封装在DLL中的一系列函数,
了解DLL调用机制的最好办法就是我们自己利用易语言编写个DLL然后我们再自己的程序中调用。
说做就做,不知道你有没有用过易写过DLL,没有也没关系,我们来练习一下:打开易语言,
新建"动态链接库",我们单击右键新建一个子程序,起名叫"MyAPI"改好名字后,在名字编辑框里"回车"3下,这样就完成添加了3个空白参数,参数名和类型等可以按自己的实际需要填写,
最后说明,如果你要外面的程序可以调用,一定要把"公开"勾上,下面是我的示例代码:
.版本 2
.子程序 MyAPI, 整数型, 公开
.参数 提示信息, 文本型
.参数 按钮类型, 整数型
.参数 窗口标题, 文本型
返回 (信息框 (提示信息, 按钮类型, 窗口标题))
这样,带参数调用这个子程序后,程序就会根据传过来的参数调用易语言自带的信息框函数,并返回结果给调用方
OK,我们把它编译出来存为"Mydll.dll",我们再新建一个窗口程序,先保存在"Mydll.dll"的同目录,然
后点击左栏的"DLL命令"在右栏的空白处单击右键,选择第一项"新DLL命令"来新建一个DLL命令,在这个
新DLL命令的"DLL命令名"里写入一个便于理解的名字,这里就叫"MyMSGBox",在"返回值类型"里写入之前在DLL里定义的类型"整数型",在"DLL库文件名"里写入我们的DLL名字"Mydll.dll"在"DLL库中对应命令名"中写入我们在DLL中公开的子程序名"MyAPI",然后"回车"3下,添加3个参数,名称不一定要相同,但类型一定要和我们在DLL里的子程序"MyAPI"
按照顺序一一对应(注:DLL中的函数是区分英文大小写的),如下面的代码:
.DLL命令 MyMSGBox, 整数型, "Mydll.dll", "MyAPI"
.参数 提示信息, 文本型
.参数 按钮类型, 整数型
.参数 窗口标题, 文本型
OK,我们回到窗口界面,双击窗口,来到"_启动窗口_创建完毕"事件,在其下面写入如下代码:
.如果真 (MyMSGBox (“调用DLL成功!要退出程序吗?”, #是否钮, “信息”) = #是钮)
结束 ()
.如果真结束
写好后,F5运行,是不是出现了一个信息框啊!点"是"后还会退出程序!
恩,搞懂了这些,理解API也就不难了! API实际上就是一些在DLL中公开的子程序,我们只要事先知道这
些子程序的名子及它的参数和它所在的DLL名称,象上面一样我们先在"DLL命令"那里声明后,就可以在易
程序中像调用子程序那样调用了,我们一般查到的API资料都是些VB声明,就像下面的GetWindowText函数:
GetWindowText
VB声明
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch
As Long) As Long
说明
取得一个窗体的标题(caption)文字,或者一个控件的内容(在vb里使用:使用vb窗体或控件的caption或text属性)
返回值
Long,复制到lpString的字串长度;不包括空中止字符。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,欲获取文字的那个窗口的句柄
lpString String,预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入
cch Long,lpString缓冲区的长度
注解
不能用它从另一个应用程序的编辑控件中获取文字
其中较重要的就是下面这句:
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
其中Lib后面的"user32"就是易中的"DLL库文件名",Alias后面的"GetWindowTextA"就是"DLL库中对应命
令名",括号里的就是它的参数每个参数间用","号隔开,其中AS后面的就是参数类型,前面的是参数的名
称(简单的描述),括号外的As后面的就是返回值类型,这里的"Long"的中文意思就是"整数
型","String"是"文本型",所以这个API在易中就是这样声明的:
.DLL命令 取得窗口标题, 整数型, "user32.dll", "GetWindowTextA"
.参数 窗口句柄, 整数型
.参数 缓冲区, 文本型
.参数 缓冲区的长度, 整数型
问: 窗口句柄我知道,可那个缓冲区和缓冲区的长度是怎么回事啊?
答: 据我自己的理解应该是这样,不知道对不对,也希望高手指教!
这个问题跟内存传递数据的方式不无关系,不知道你有没有注意到DLL命令参数那还有个"传址"的选
项,我们把鼠标移上去会出现一个提示,大意是说:如果参数的数据类型是文本,字节集,数组,用户自定以
类型,库定以类型等不管是否选择此项都将直接传递地址过去而不是数据!也就是说DLL和调用程序间不
能直接传递文本型的数据,只能传递文本型的数据在内存中的地址,而窗口标题是个文本型数据;
API不能直接把结果返回给我们,而是直接把结果写到我们提供的参数变量"缓冲区"的地址,在内存
中的数据都是些字节型的数据,而文本数据是以1字节的{0}为结束标志,API要写入或保留这个标志,先
要知道这个缓冲区的长度,所以就有了个"缓冲区的长度"的参数!并且,不只是这个API函数用这个方法,
很多类似的API都是用的这个方法,像GetClassName(取窗口类名)等.
搞清楚了这样,我们就知道在易中该怎么调用了,如下面的代码:
.子程序 API取得窗口标题, 文本型
.参数 窗口句柄, 整数型
.局部变量 缓存, 文本型
缓存 = 取空白文本 (1000) '我们要先在内存中分配足够多的空间
取得窗口标题 (窗口句柄, 缓存, 取文本长度 (缓存) ) 'API调用是写入窗口标题到缓存的地址
返回 (缓存)
然后
窗口名称=API取得窗口标题(窗口句柄)