Visual Basic以友好易学的可视化开发环境闻名于 世,成为人们学习计算机编程的首选语言。目前,全世界 大概有300多万人使用着Visual Basic语言。如果您想在 这茫茫众生中出类拔萃,那么您就不得不学习API (Application Program lnterface,即Windows的应用程 序编程接口)编程。不懂API,那可成不了高手。 第一节:API基础 API说到底就是一系列的底层
函数,是系统提供给
用户用于进入操作系统核心,进行高级编程的途径。通 过在Visual Basic应用程序中声明外部过程就能够 访问Windows API(以及其它的外部DLLs)。在声明 了过程之后,
调用它的
方法与
调用Visual Basic自 己的过程相同。要声明一个DLL过程,需要在
代码窗 口的"声明"部分
增加一个Declare语句,如果该过 程返回一个值,应将其声明为Function。例如: Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type 如果过程没有返回值,可将其声明为Sub。 缺省情况下,在标准模块中声明的DLL过程,可 以在应用程序的任何地方
调用它。在其他类型的模块 中定义的DLL过程是模块私有的,必须在它们前面
加上Private关键字,以示区分。特别提请注意的 是,在32位的Visual Basic中过程名是区分大小 写的。而在以前的16位版本中并不区分大小写,这 是初学者容易出错的地方。 Declare语句中的Lib子句用来告诉Visual Basic如何找到包含该过程的dll
文件。如果引用的过 程属于Windows核心库(User32、Kernel32或 GDI32),则可以不包含
文件扩展名。例如: Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount"() As Long。对于其它DLL, Lib子句须指定
文件的路径及扩展名。 如果
调用的Windows API过程要使用字符串,那 么在声明语句中必须
增加一个Alias子句,以指定 正确的字符集。包含字符串的Windows API
函数实 际有两种格武ANSI格式Unicode格式。因此,在 Windows头
文件中,每个包含字符串的
函数都同时有 ANSI版本和Unicode版本。 例如,下面是SetWindowText
函数的两种C语言描 述。可以看到,第一个描述将
函数定义为SetWindowTextA,尾部的"A"表明它是一个ANSI
函数: SetWindowTextA(HWND hWnd,LPCSTR lpString); 第二个描述将它定义为SetWindowTextW,尾部的 "w"表明它是一个Unicode
函数: SetWindowTextW(HWND Hwnd,LPCWSTR lpString); 因为两个
函数实际的
名称都不是"SetWindow Text",要引用正确的
函数就必须
增加一个Alias子句: Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA"(ByVal hwnd As Longg,ByVal lpString As String) As Long 请注意, Alias子句后面的字符串必须是过程的 真正
名称,必须是区分大小写的。事实上,您只需要 记住,只有Windows NT才
支持Unicode格式,而 Windows 95只
支持ANSI格式就行了。至于两者的区 别,作一般的应用程序开发是不需要了解的。 VB5专业版在VB目录的Winapi子目录下,用几 个
文件提供了关于API的信息。 Win32api.txt
文件中 包含了32位Windows API
函数中用到的
函数和类型的 结构声明以及全局常量的值。
用户可以用VB本身带的外 接程序"API浏览器"来方便地使用Win32api.Txt,如下 所示: 点击
菜单文件项的"加载文本
文件…"从VB目 录下的WINAPI目录中选择"WIN32API.TXT",就可以 查看WINDOWS 95系统的API
函数的声明、常数定义和 数据类型了。例如,我们打算查看
函数InverRect() 的声明。首先,点击"
搜索"按钮,输入字符串 "InverRect"。在"可选项"栏中,兰色的亮度条将移 动到"InverRect"项上。再点按"
添加"按钮,在"选 定项"中就出现"InverRect"在Visual Basic中的 声明了。接下来自然是点按"复制"按钮,然后将窗 口切换到Visual Basic开发环境中,在需要声明API
函数的地方Ctrl+V(粘贴)即可。 上面所讲的声明
方法虽然简单,但只有使用WIN DOWS本身的API
函数才能这样。对于第三方提供的动 态
链接库(DLL)您只有用
键盘老老实实地敲了。 第二节:牛刀小试 现在读者一定很想自己亲自试一下,下面举两个 实际应用的例子让大家体会一下API的妙用吧! 1.使一个窗体始终保持在屏幕的最上面 我们知道VB本身
自带的
函数是难以完成此
功能 的,我们可以通过
调用Windows的API
函数: SetWindowPos达到我们的要求。操作步骤如下: (1)启动VB5建立一个新工程,在该工程中
添加一 个模块(Moudel),在该模块中用上述的"API例览器"
添加如下的该API
函数的
函数声明和常量声明部分: 注释:API
函数声明 Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal x As Long,ByVal y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags As Long) As Long 注释:常量声明 Global Const SWP_HIDEWINDOW = &H80 Global Const SWP_NOACTIVATE = &H10 Global Const SWP_NOCOPYBITS = &H100 Global Const SWP_NOMOVE = &H2 Global Const SWP_NOOWNERZORDER = &H200 Global Const SWP_NOREDRAW = &H8 Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER Global Const SWP_NOSIZE = &H1 Global Const SWP_NOZORDER = &H4 Global Const SWP_SHOWWINDOW = &H40 Global Const HWND_BOTTOM = 1 Global Const HWND_BROADCAST = &HFFFF& Global Const HWND_DESKTOP = 0 Global Const HWND_NOTOPMOST = -2 Global Const HWND_TOPMOST = -1 Global Const HWND_TOP = 0 Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE 这里以"SWP_"开头的常量是表示窗体所具有的 风格,这些常量可以通过VB中的"OR"操作符组合在 一起。而以"HWND_"开头的常量表示窗体在桌面上的 位置。从这些常量的英文单词的意义上读者应该很容 易理解他们所具有的风格了。所以笔者就不一一去说 明了。至于为什么要
添加这些常量而不是别的这就要 您去查看Windows SDK关于该
函数的帮助文档了。当 然这对于初学者来说有一定的难度,但不要畏惧,只 要您仔细看帮助就会慢慢搞懂的。因为这些API
函数 是为C和C++的编程人员编写的,所以如果您懂一点 C++的话会很容易理解的。 (2)现在只要在您想要此
功能的地方
调用该
函数 就可以了,
调用的
方法如: Dim Success as Long SuccesS=SetwindowPos(me.HWnd. HWND_TOPMOST,FLAGS) 若Success返回的值不等于零则表示
调用成功。 比如在某个窗体的Load事件中加入上述的两行代 码,就可以达到使该窗体始终位于屏幕最上面的目的。 细心的读者可能已经发现上面的例子中的模块声 明中声明了好几个常量,可为什么只用到三个呢?现 在您可以试着改变一下API
函数"SetWindowPos"中 的第二个参数或常量FLAGS中的项,看看您的窗体会 出现什么样的
效果? 2.VB5中如何
屏蔽掉win95中的CTRL_ALT_DEL, CTRL_ESC,ALT_TAB三组热键通过
调用API
函数"SystemParametersInfo"来实 现。 首先创建一新工程;在此工程中
添加一个窗体和 一个模块;在窗体上拖放两个按钮分别命名为 "cmdDisable","cmdEnable";Copy如下
代码入模块中: Public Declare Function SystemParametersInfo Lib "user32" Ahias "SystemParametersInfoA" (ByVal uAction As Long,ByVal uParam As Long,lpvParam As Any,ByVal fuWinIni As Long)AS Long Public Const SPI_SCREENSAVERRUNNING=97 在窗体的
代码编辑区Copy如下
代码: 注释:使三组热键失效 Private Sub cmdDisable_click() SystemParametersInfo SPI_SCREENSAVERRUNNING,True,byVal 1&,0 End Sub Private Sub Form_Unload(Cancel As Integer) 注释:程序
退出前是热键有效 CndEnable_Click End Sub 若将此
功能和屏幕保护程序结合到一起,那您的屏幕 保护程序一定增色许多。 API
函数的简单
调用例子就是这么容易,相信现在您 对API的
调用已不再感到神秘了,接下来我们就看看一个 比较复杂的应用。 第三节:高手进阶 上面的关于API的
调用的例子只是为了带您去Win dows API世界中去探索一下。相信您已探索到了一点眉 目并想去实现一些更"好玩"的东西了。好!下面就向您 介绍一个很"好玩"同时又会使您的程序看起来更专业化 的一个API
调用。 相信您的机器上一定装有"金山词霸",试着启动它 您发现了什么?启动画面过后它"不见了"。把鼠标移到 桌面的右下角,原来它以图标的形式"藏在" Windows 的托盘中。用鼠标右击它还会弹出一个
菜单功能项供您 选择。现在您一定想把自己的程序也放到托盘,这样您的 程序多具有专业水准! 下面是此
功能的实现步骤: 1.这里我们
调用的API
函数是: "Shell_NotifyIcon",在您的模块中
添加如下的
函数声明 和常量声明: 注释:以下常量告诉系统在托盘中您的图标上发生了什么 操作 注释:常量声明 Public Const WM_MOUSEMOVE = &H200 注释:在图标上移动鼠标 Public Const WM_LBUTTONDOWN = &H201 注释:鼠标左键按下 Public Const WM_LBUTTONUP = &H202 注释:鼠标左键释放 Public Const WM_LBUTTONDBLCLK = &H203 注释:双击鼠标左键 Public Const WM_RBUTTONDOWN = &H204 注释:鼠标右键按下 Public Const WM_RBUTTONUP = &H205 注释:鼠标右键释放 Public Const WM_RBUTTONDBLCLK = &H206 注释:双击鼠标右键 Public Const WM_SETHOTKEY = &H32 注释:响应您定义的热键 注释:API
函数声明 Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long,lpData As NOTIFYICONDATA) As Long 注释:
自定义一个
调用API Shell_NotifyIcon要用到的类 型"NOTIFYICONDATA" Public Type NOTIFYICONDATA cdSize As Long 注释:NOTIFYICONDATA类型的大小 hwnd As Long 注释:你的应用程序窗体的名柄 uId As Long 注释:应用程序图标资源的ID号 uFlags As Long 注释:使那些参数有效它是以下枚举类型中的 注释:NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合 uCallbackMessage As Long 注释:鼠标移动时把此消息发给该图标的窗体 hIcon As Long 注释:图标名柄 szTip As String*64 注释:当鼠标在图标上时
显示的Tip文本 End Type 注释:这是一个枚举类型它告诉API Shell_NotifyIcon去做什么操作 Public Enum enm_NIM_Shell NIM_ADD=&H40 注释:在“金碟”中加一图标 NIM_MODIFY=&H1 注释:
修改“金碟”中的图标 NIM_DELETE=&H2 注释:
删除“金碟”中的图标 NIF_MESSAGE=&H1 注释:使类型"NOTIFYICONDATA"中的uCallbackMessage有效 NIF_ICON=&H2 注释:使类型"NOTIFYICONDATA"中的hIcon有效 NIF_TIP=&H4 注释:使类型"NOTIFYICONDATA"中的szTip有效 WM_MOUSEMOVE=&H200 注释:使鼠标移动消息有效 End Enum 注释:定义一个"NOTIFYICONDATA"类型的变量 Public nidProgramData As NOTIFYICONDATA 以上是
函数及常量声明和
自定义的一个类型变量,下 面是此API
函数的
调用方法: 2. 在窗体上用
菜单编辑一个具有如下信息的
菜单项: 主
菜单:无
标题、
名称(mainMenu) 子
菜单:
标题(API编程)、
名称(submnul);
标题(
退出)、
名称(submnu2). 这里只是举个例子,具体的
功能你可以根据你的具体需要来编辑此
菜单项 3. 在窗体的Load事件中
添加如下
代码: Private Sub Form_Load() 注释:隐藏窗体 With Me .Top =-10000 .Left = -10000 .WindowState = vbMinimized End With 注释:设置类型NOTIFYICONDATA所具有的特征 With nidprogramData .cbSize = Len(nidProgramData) .hwnd = Me.hwnd .uld = vbNull .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 注释:触发鼠标移动消息 .uCallbackMessage = WM_MOUSEMOVE .hIcon = Me.Icon 注释:“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的图标 .szTip ="VB 的 Win32 API 编程" & vbNullChar End With 注释:
调用该
函数 Shell_NotifyIcon NIM_ADD,nidprogramData End Sub 注释:根据不同的鼠标消息做不同的操作 Private Sub Form_MouseMove(Button As inte ger,Shift As lnteger,x As Single,Y As Single) On Error GoTo Form_MouseMove_err: Dim Result As Long Dim msg As Long 注释:X的值依赖与
显示模式的设置 If Me.ScaleMode = vbpixels Then msg = x Else msg = x/Screen.TwipsPerPixe1X End If Select Case msg Case WM_LBUTTONUP 注释:在这里加入鼠标左键释放时你想做的操作 Case WM_LBUTTONDBLCLK 注释:在这里加入双击鼠标左键时你想做的操作 Case WM_RBUTTONUP 注释:通常这里弹出你的
功能菜单 PopupMenu mainMenu Case WM_MOUSEISMOVING 注释:在这里加入鼠标正在移动时你想做的操作 End Select Exit Sub Form_MouseMove_err: 注释:在这里加入你的处理异常
错误的
代码 End Sub