1、VB API 入门教程 接受网友的意见,写了一篇关于 VB API 的文章,希望大家能从中学到一些知识。 一、API 是什么?这个我本来不想说的,不过也许你知道其它人不知道,这里为了照顾一下新手,不得不说些废话,请大家谅解。Win32 API 即为 Microsoft 32 位平台的应用程序编程接口(Application Programming Interface) 。所有在 in32 平台上运行的应用程序都可以调用这些函数。使用 Win32 API,应用程序可以充分挖掘 Windows 的 32 位操作系统的潜力。Mircrosoft 的所有 32 位平台都支持统一的 API,包括函数、结
2、构、消息、宏及接口。使用 Win32 API 不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。以上为 API 的相关介绍,不过有些新手看了以后可能还是不怎么明白 API 到底有什么用?这里请不要着急,如果你有足够耐心的话,请慢慢往下看。二、如何使用 API?估计这才是大家真正关心的,那么如何使用 API 呢?在了解 API 之前,先打开你的VB 书,翻到过程函数这章来,在搞清楚 API 之前应该先搞懂过程函数是怎么一回事!如果你还不知道过程的工作方式,那么请先不要急着往下看,那样容易走很多弯路。好了,当你理解了过程函数时,也就是你可以使用 API
3、的时候了,别把 API 看得太难,你就像使用过程函数一样使用 API 就可以了。首先,让我们看看一个简单的 API,以下:Private Declare Sub Sleep Lib “kernel32“ Alias “Sleep“ (ByVal dwMilliseconds As Long)以上这个 API 的呢是起一个延时作用。你如果是刚接触 API 的话可能会感到 API 的书写及其复杂,而且会感到很不适应。其实这没什么的,慢慢习惯就好了。至于 API 这些复杂的书写你就不用操心了,在你安装 VB 的时候微软已经帮我们带上了 API 浏览器,这些全部都可以利用 API 浏览器帮我们自动生成
4、。API 浏览器的位置位于 开始菜单程序Microsoft Visual Basic 6.0 中文版Microsoft Visual Basic 6.0 中文版工具API 文本浏览器。打开 API 浏览器,在最上面的一个文本框中输入 Sleep,这时下面列表框中就会自动显示相应的 API 函数,然后点右边添加按钮即可,接着点击复制按钮,这时你就可以用Ctrl+V 把声明的 API 添加到 VB 代码窗口中了。这里我要说一下,有些新手可能还弄不明白。API 的声明范围一般有两种模式,一种是 Private(私有的),一种是 Public(公用的) 。一般 Private 是声明在类模块或窗体类中
5、, Public声明在模块中。你在添加 API 的时候,添加按钮下面就有 API 的声明范围,可以根据自己的需要进行添加。这里我们一般选择私有的(Private)就可以了。经过上面,我们知道如何添加 API,接着我们分析一下 API 声明,这是你了解 API 必备的。首先看第一个单词 Private,很显然,我上面刚刚讲过,这是申明一个私有的 API 变量。再看第二个 Declare,这个单词帮我们告诉 VB 是在申明 API 函数,一般申明外在的API 函数时都必须带上这个单词。第三个 Sub,别告诉我你不知道什么意思?这就是我叫你先学习 VB 中过程函数的意思,这个说白了就是没有反回值,一
6、般如果不是 Sub 而是Function 都带有反回值的。第四个 Lib,这个是告诉 VB 我们要声明哪一个 DLL 中的 API函数,也就是告诉 VB 我们要申明第五个单词 kernel32.dLL 中的 API,一般写 DLL 名称时都要用双引号括起来,如“user32“、“shell32.dll“ 等,至于后面的 .dll 这个可以带可不带。再来看第六个 Alias,这个也是需要同后面一个一起用的,我们应该把第六个和第七个连起来一起看 Alias “Sleep“,这个意思表示将被调用的过程在 DLL 中还有另外的名称,这个是可选的。最后括号里面的,也就是和过程函数一样,你传入相应的值就可
7、以了。上面我们分析完 API 函数声明以后,接着我们就要自己动手写代码了。先把这个 API复制到 Form1 代码窗口中,然后写如下代码:Private Declare Sub Sleep Lib “kernel32“ (ByVal dwMilliseconds As Long)Private Sub Form_Load()Sleep 2000End Sub解释一下,也就是在窗体启动时使用 Sleep API 进行延时 2 秒,后面的参数dwMilliseconds 是表示你要延时的秒数,基本上和设置 Timer 中的秒数一样。你再看一下Sleep 2000 的使用方式,是不是和使用 VB 过
8、程函数一样呢?好了,我们的第一个 VB API 程序写完了,可以看到使用 API 并不是一件很难的事。三、如何才能提升你对 API 的学习兴趣?API,我常把它看做成过程函数,不过每人都有每人的见解和理解方式,自己的理解方式只要可以帮助自己更好的学习和掌握 API,也没必要一定要学习他人的。1,自己做 MsgBox了解 API 参数的使用方法是很重要的,这里我们不用 VB 的 MsgBox,直接使用 API弹出 MsgBox 消息框。首先,打开 API 浏览器,选择 MessageBox,大家可以用这个 API和 VB 内置的 MsgBox 比较一下,其实 MsgBox 也就是 Message
9、Box 的缩写,只不过一个是API,一个是 VB 内置的,但两者都是通过 API 进行工作的。好了,选择私有声明方式,粘贴到 VB 代码编辑窗口中,然后新建一个 CommandButton,写入以下代码:Private Declare Function MessageBox Lib “user32“ Alias “MessageBoxA“ (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As LongPrivate Sub Command1_Click()M
10、essageBox Me.hwnd, “这里是内容“, “标题“, 0End Sub先让我们来分析一下,首先看第一个参数 Byval hWnd As Long,很显然这是一个长整形变量,所以我们这里需要传递的是数字,你可能会发现我们传递的并不是数字啊,而是 Me.hwnd?很奇怪是吗?如果你真的有此疑问说明你是真心想要学习好 API 的,现在就让我们来看看 Me.hwnd 到底是什么东西?以下摘自 VB 帮助文档:hWnd 属性:返回窗体或控件的句柄。句 柄:是由操作环境定义的一个唯一的整数值,它被程序用来标识或者切换到对象,如窗体或控件等。现在估计你差不多就已经明白了,我们调用的 hwnd
11、其实是一个句柄整数值,你可以用 Msgbox Me.hwnd 看一下就知道了。至于 Me 这是一个关键字,代表当前 Form 窗体对象。如:Me.Caption=“标题“ 、Me.BackColor=vbRed 等。( “print Me.hwnd”输出 不关掉窗体每次相同,关掉重新运行后不同)接上面的,首先我们传入了 Me.hwnd,表示是当前窗口调用 MessageBox,这里告诉大家一个技巧,也就是以后凡是看到 Byval hwnd As Long,一般都是需要传入句柄的,至于传入哪个对象句柄,那就要看你是怎么实现的了。ByVal lpText As String,这个是字符串变量,标识
12、着叫我们需要传入字符串进去,可以看里面的变量字符 lpText,属于文本的意思,也就是说是用来显示 MsgBox 中的消息文本的。ByVal lpCaption As String,也是字符串变量,还是传入字符串进去。在看里面的变量字符 lpCaption,其实就是显示 MsgBox 标题的。ByVal wType As Long,这是一个整形变量,需要传递整形数字,还是看里面的变量字符 wType,标识着显示 MsgBox 类型,这里可以像 VB 的 MsgBox 一样使用,如这里可以传入:vbYesNo,vbOkCancel 等,如果忽略那就传入 0 即可。好了,按 F5 启动程序,点击
13、Command1,接着就会弹出一个消息框,这里我们制作以及分析 MsgBox 已经完成了。希望你能在这段学习到一些知识。2,来点实用的吧就拿隐藏 Windows 任务管理器来说吧,这里只能隐藏任务管理器中的窗口,不能隐藏进程。( 问:有没有隐藏进程的 ?答:你想干什么?) ,当程序运行后你无法从任务管理器的窗口中关闭程序,只能从进程中进行终止。好了,还是老规矩,打开 API 浏览器,输入GetWindow 和 ShowWindow 两个 API,声明范围还是私有的,复制粘贴到 Form 代码窗口中,嗯,好了?别急,还是 API 浏览器,选择 Combox 中的常数,输入 GW_OWNER 和S
14、W_HIDE 这两个 API 常数,然后粘贴到代码窗口中,问我这两个是干什么的?那就接着往下看吧。写入以下代码:Private Declare Function GetWindow Lib “user32“ (ByVal hwnd As Long, ByVal wCmd As Long) As LongPrivate Declare Function ShowWindow Lib “user32“ (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Const GW_OWNER = 4Private Const SW_HIDE
15、 = 0Private Sub Form_Load()Dim lphWnd As LonglphWnd = GetWindow(Me.hwnd, GW_OWNER)ShowWindow lphWnd, SW_HIDEEnd Sub又到了分析的时候了,这对刚入门的新手可谓是最激动的时候了。好了,还是老子,看看两个 API 的表面意思和传递值变量。先看 GetWindow,表面意思:获取窗口。传递值变量: hWnd 整形句柄,wCmd 整形命令值。再看 ShowWindow,表面意思:显示窗口。传递值变量:hWnd 整形句柄,nCmdShow整形命令值。然后是使用代码,先看 lphWnd = Ge
16、tWindow(Me.hwnd, GW_OWNER)这句,这句意思是获取当前窗口的所有者窗口句柄( “print Me.hwnd”输出 不关掉窗体每次相同,关掉重新运行后不同) 。 。 。 ( “print lphwnd”输出 不关掉窗体每次相同,关掉重新运行每次输出也相同) ,可以看到 GetWindow 是 Function 过程函数,执行以后会返回相应的窗口句柄值,这个值为 Long 整形(同句柄 )。接着调用 ShowWindow lphWnd, SW_HIDE,这句意思是显示 lphwnd 这个句柄的窗口,关键一句是最后的 SW_HIDE,这是 API 函数的常量。通过设置常量能让系
17、统知道 API 到底应该怎么执行显示窗口,是显示?还是隐藏?Hide 当然是隐藏的意思。好了,编译成 Exe,运行后打开任务管理器,查看程序窗口,还有吗?我又要说一下了,有些人可能不懂为什么要用 GW_OWNER 这些常量,这些到底有什么用?还有就是我怎么知道哪些 API 对应哪些的常量?其实这些常量你只要稍微注意一下就知道它们是怎么回事了,如在 GetWindow 中我使用 GW_OWNER,在 ShowWindow 中我使用 SW_HIDE 这些常量都有一个共同的特点,就是他们都是以 API 的单词第一个字母为标准。如 GetWindow 相对应的常量就是 Get(G)Window(W)=
18、GW,ShowWindow 相对应的常就是 Show(S)Window(W)=SW,这些常量可以自己在 VB 的 API 浏览器中找找看。 (讲了这么多还是没讲常量到底有什么作用呵,GW_OWNER 寻找窗口所有者,SW_HIDE 隐藏窗口,活动状态给另一个窗口)3.继续往下学吧。 。上面两个我们讲到了一般 API 的使用方法,和一些 API 常量的使用方法,接着我们来看看 API 类型的使用方法,在了解这一小节前请先搞懂 VB 中的自定义类型(Type)这章,否则你可能会稀里糊涂的,到时别怪我没提醒你哦!这次让我们来获取一下鼠标指针的位置。这里教大家一个技巧,当你想用 API 去实现某一特定
19、的功能时,却又不知道该用哪个 API,这时你可以就表面的意思到 API 浏览器找找,有 70%以上的机率可以找到哦!现在就拿这个 API 开刀,那我们应该如何找?别着急,往下看:如我们现在要获取鼠标指针位置,可以这样翻译一下:Get(获取)Cursor(指针)Pos(位置) ,组合起来: GetCursorPos,呵呵,一条 API 就这样出来了,到 API 浏览器输入这个组合单词,呵,有吧?见以下:Private Declare Function GetCursorPos Lib “user32“ Alias “GetCursorPos“ (lpPoint As POINTAPI) As L
20、ong好了好了,高兴一下就算了,现在让我们分析一下这个 API,看其它的没啥不同的,其中只有一个参数,就是最后一个变量有些不懂?在 VB 中好像没有见过这个变量?不明白么?那就再继续往下看。lpPoint As POINTAPI,POINTAPI?很显然,在 VB 中并没有此类型,一般都是String、 Integer、Long、Byte 等变量类型,那么这个也就理所当然的是自定义类型(问:什么是自定义类型?答:不知道,自已不会看书啊)。既然是自定义类型,那么我们如何才能知道它是如何定义的呢?这里也就不用你操心啦,还是 API 浏览器,在最上面的 Combox中选择类型,这时下面 List 中
21、也就自然的把 API 的相关类型显示出来了,现在我们开始在Text 文本框中输入我们需要的自定义类型,POINTAPI,点击添加,出来了吧?如下:Private Type POINTAPIx As Longy As LongEnd Type好了,现在开始写代码,添加一个 Timer 控件,设置属性见以下:Interval = 100Enabled = True双击 Timer 控件,转到代码环境中写入以下代码:Private Declare Function GetCursorPos Lib “user32“ (lpPoint As POINTAPI) As LongPrivate Type
22、POINTAPIx As Longy As LongEnd TypePrivate Sub Timer1_Timer()Dim lpPoint As POINTAPIGetCursorPos lpPointMe.Caption = “X = “ Text=123456789,Text2 的属性基本上没有什么需要设置的,只需要把 Text 属性为空就可以了,它主要是用来帮助咱们显示出密码的。好了,在 Form1 代码框中填入以下代码:Private Declare Function GetWindowText Lib “user32“ Alias “GetWindowTextA“ (ByVal
23、hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongPrivate Sub Command1_Click()Dim sBuffer As StringsBuffer = Space(255)GetWindowText Text1.hwnd, sBuffer, 255Text2.Text = sBufferEnd SubOK,F5 运行,点击 Command1,怎么样?Text1 中的密码字符显示在 Text2 中了吧?你可以再更改下 Text1 中的密码,然后再点击 Command1 试试。也许你觉得会多此一举,为
24、何不 Text2.Text=Text1.Text 这样?如果真的这样的话看似简单,那你就学不到 API 了。又到了开始分析的时候了,打起精神来,先看第一句:Dim sBuffer As String,不用说,声明一个字符串变量呗!接着看第二句:sBuffer = Space(255) 那这一句呢?有些人可能不知道了,没事,我会仔细讲的。Space 是 VB 内置的字符串处理函数, VB 中的帮助文件中有说明:开始本示例使用 Space 函数来生成一个字符串,字符串的内容为空格,长度为指定的长度。Dim MyString 返回 10 个空格的字符串。MyString = Space(10) 将
25、10 个空格插入两个字符串中间。MyString = “Hello“ & Space(10) & “World“结束很显然,我这一句是要分配 255 个空格字符串内存,为啥要用分配?这都是为后面所要用到打定的基础。接着往下:GetWindowText Text1.hwnd, sBuffer, 255 这一步是关键,通过它来获取咱们想要的窗口文本,看第一个参数,我前面讲过 hwnd 一般都是需要传入句柄的,这时咱们传入了Text1.hwnd(Text1 控件的句柄) ,第二个参数,lpSting 为字符串变量,所以这里咱们传入sBuffer 字符串变量。最后一个 cch 为 Long 整形,所以
26、理应传入数字,这里我们传入了255。现在又有人想问了,为什么需要这么传入值?貌似和以前的传入不一样?确实!一刚开始你可能搞不懂,这时候我先讲讲大概的意思,我们用 GetWindowText 来获取窗口中的文本,当获取成功以后,理所当然会返回窗口中的字符串,但是当我们用这个 API 进行获取时,必须需要一个缓冲来保存我们所获取的字符串,你如果不信去试试把 sBuffer = Space(255)去掉,后面的 255 其实就是告诉这个 API 我们缓冲字符串的大小,这里再告诉大家一个技巧,以后只要是看见包函有 cch 字符时,大部分都是输入相关类型的大小 。再附加一点,就里我说过,hwnd 是用来
27、传句柄的,你也可以传入其它窗口句柄,只要其它窗口有文本,都是可以通过这个 API 获取的。还有 Text2.Text = sBuffer 其实是可以先把 sBuffer 处理一下再传给 Text2.Text 的,关于字符串处理这里不讲。好了,分析结束,来个小提示:在 Windows 操作系统中,任何有句柄的东东都可被看作为一个窗口。另外你可能会去试试 QQ 的密码框,_ 这里我要告诉你一下,无法成功,为什么无法成功呢?这是一个技术问题目前不提!接着再来试试 GetWindowsDirectory,大家看表面意思吧!Get(获取)Windows(就是Windows 目录)Directory(目录
28、 ),也就是获取咱们那个系统目录,如: C:Windows。可能我的 Windows 目录中在 C 盘,而其它人的可能在 D 盘、E 盘也说不定,所以有的时候软件需要这个 API 进行获取操作系统具体的 Windows 目录。好了,还是新建一个标准 EXE,添加一个 CommandButton,属性 Caption=显示Windows 目录,OK,写入以下代码:Private Declare Function GetWindowsDirectory Lib “kernel32“ Alias “GetWindowsDirectoryA“ (ByVal lpBuffer As String, By
29、Val nSize As Long) As LongPrivate Sub Command1_Click()Dim sBuffer As StringsBuffer = Space(255)GetWindowsDirectory sBuffer, 255MsgBox “Windows 目录在: “ & sBufferEnd Sub分析!第一个 Dim sBuffer As String 字符串变量,sBuffer = Space(255)缓冲字符串,GetWindowsDirectory sBuffer, 255 这个和上面所讲的一样,最后一个参数 nSize 为 Long 整形,所以传入数值,那传入什么数值呢?Size?当然是缓冲字符串大小了,以后遇到这个 nSize 一般也是传入相关类型的大小的。MsgBox “Windows 目录在: “ & sBuffer,是用 MsgBox 消息框显示出 Windows 目录的位置。OK,恭喜你,你又会使用了一个 API,还要继续吗? (问:当然还要啦!答:最后一