API就是Application Programming Interface(应用程序接口)的英文缩写,API是建立在Windows操作系统内部的1000多个函数的集合。
在本章中,我们将要学习如何在Visual Basic中调用Windows的API函数来实现对文字、图形、图像和多媒体的处理。
用户平时经常可以看到Windows登录注册程序,比如进入Windows NT时的用户注册登录。为了了解API,我们利用Windows提供的API函数制作一个系统简易的系统登录程序。它所实现的功能是,如果用户不能够输入正确的用户名和密码密码,就会被拒绝进入Windows操作系统,如果用户强行关闭登录程序,就会同时关闭计算机,所以就保护了数据的安全。
在这里就给出一个在Visual Basic通过调用API函数制作Windows登录程序的示例,具体的步骤如下:
在屏幕上会出现一个空白的窗体。但是在Visual Basic中自己提供了一个用于制作登录程序的窗体,所以首先删除空白的窗体,选择菜单“工程”/“删除Form1”来删除窗体1,然后选择菜单“工程”/“添加窗体”,就会弹出添加窗体对话框,选择其中的Log in Dialog,如图9-1所示。

图9-1 Log in Dialog图标
单击OK按钮后的窗体如图9-2所示。

图9-2 Log in Dialog窗体
在这里系统已经自动的为我们生成了程序的框架,只要在上面添加一些代码和少量的控件就可以实现登录程序的功能。窗体的属性设置如表9-1所示。
表9-1 窗体的属性设置
|
属 性 |
设 置 |
|
(Name) |
FrmLogin |
|
BorderStyle |
3 - Fixed Dialog |
|
Caption |
Login |
|
Enabled |
True |
|
Height |
1920 |
|
Left |
2790 |
|
Moveable |
False |
|
Picture |
(None) |
|
StartUpPosition |
2 - CenterScreen |
|
Top |
3150 |
|
Visible |
True |
|
Width |
3840 |
为了保证登录窗口始终位于其他窗口的前面,需要定时检测登录窗体的位置,如果有别的窗口在它的前面,那么就可以调用API函数改变各窗口的相对位置。
首先在窗体上放置一个Timer控件,它的属性设置如表9-2所示。
表9-2 Timer控件属性设置
|
属 性 |
设 置 |
|
(Name) |
Timer1 |
|
Enabled |
True |
|
Interval |
1000 |
|
Left |
0 |
|
Top |
567.2 |
提示:
@ Interval属性设置为1000,也就意味着每个1秒钟就会激活一次Timer1_Timer()事件。
除了Timer空间之外,为了改变各窗口的相对位置,还需要调用SetWindowPos()函数,它的声明如下:
Private Declare Function SetWindowPos Lib "user32" (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
函数的参数及其说明如表9-3所示。
表9-3 函数的参数及说明
|
参 数 |
说 明 |
|
Hwnd |
窗口的句柄 |
|
HWndInsertAfter |
指定各个窗口的顺序 |
|
X |
窗口的左上角的x坐标 |
|
Y |
窗口的左上角的y坐标 |
|
Cx |
窗口的新宽度 |
|
Cy |
窗口的新高度 |
|
WFlags |
影响窗口位置和大小的一个参数 |
在Timer1_Timer()事件中添加下列代码:
Private Sub Timer1_Timer()
'每隔1秒钟触发一次
SetWindowPos frmLogin.hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
'登录位于其他窗体的前面
frmLogin.SetFocus
End Sub
HWndInsertAfter参数设置为HWND_TOP,表示frmLogin窗口位于所有窗体的前面,但是还要在程序的声明段中添加定义HWND_TOP常量的代码:
Private Const HWND_TOP = 0
WFlags参数设置为SWP_NOMOVE Or SWP_NOSIZE,它的意义是不改变原有窗体的大小和位置,所以就屏蔽了x,y,cx和cy参数。同样也要在程序的声明段中添加定义SWP_NOMOVE 和 SWP_NOSIZE常量的代码:
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
完成之后的窗体如图9-3所示。

图9-3 添加了Timer控件的窗体
注意:
@ API函数声明的所有语句都要写在同一行上。
用户输入用户名和密码后,如果密码不正确,程序就会给出提示用户重新输入密码的信息;如果密码正确,结束程序的运行,实现以上功能的代码如下:
Private Sub cmdOK_Click()
If txtPassword = "password" Then
'如果用户输入的密码正确
End
'退出程序的运行
Else
'如果用户输入的密码不正确
MsgBox "Invalid Password, try again!", , "Login"
'显示一个对话框
End If