VB的API编程精粹.doc_第1页
VB的API编程精粹.doc_第2页
VB的API编程精粹.doc_第3页
VB的API编程精粹.doc_第4页
VB的API编程精粹.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VB的API编程精粹(二) 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浏览器来方便地使用Win32apiTxt,如下 所示:点击菜单文件项的加载文本文件从VB目 录下的WINAPI目录中选择WIN32API.TXT,就可以 查看WINDOWS 95系统的API函数的声明、常数定义和 数据类型了。例如,我们打算查看函数InverRect() 的声明。首先,点击搜索按钮,输入字符串 InverRect。在可选项栏中,兰色的亮度条将移 动到InverRect项上。再点按添加按钮,在选 定项中就出现InverRect在Visual Basic中的 声明了。接下来自然是点按复制按钮,然后将窗 口切换到Visual Basic开发环境中,在需要声明API 函数的地方CtrlV(粘贴)即可。上面所讲的声明方法虽然简单,但只有使用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 = &H80Global Const SWP_NOACTIVATE = &H10Global Const SWP_NOCOPYBITS = &H100Global Const SWP_NOMOVE = &H2Global Const SWP_NOOWNERZORDER = &H200Global Const SWP_NOREDRAW = &H8Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDERGlobal Const SWP_NOSIZE = &H1Global Const SWP_NOZORDER = &H4Global Const SWP_SHOWWINDOW = &H40Global Const HWND_BOTTOM = 1Global Const HWND_BROADCAST = &HFFFF&Global Const HWND_DESKTOP = 0Global Const HWND_NOTOPMOST = -2Global Const HWND_TOPMOST = -1Global Const HWND_TOP = 0Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE这里以SWP_开头的常量是表示窗体所具有的 风格,这些常量可以通过VB中的OR操作符组合在 一起。而以HWND_开头的常量表示窗体在桌面上的 位置。从这些常量的英文单词的意义上读者应该很容 易理解他们所具有的风格了。所以笔者就不一一去说 明了。至于为什么要添加这些常量而不是别的这就要 您去查看Windows SDK关于该函数的帮助文档了。当 然这对于初学者来说有一定的难度,但不要畏惧,只 要您仔细看帮助就会慢慢搞懂的。因为这些API函数 是为C和C的编程人员编写的,所以如果您懂一点 C+的话会很容易理解的。(2)现在只要在您想要此功能的地方调用该函数 就可以了,调用的方法如:Dim Success as LongSuccesSSetwindowPos(me.HWnd. HWND_TOPMOST,0,0,0,0,FLAGS)若Success返回的值不等于零则表示调用成功。比如在某个窗体的Load事件中加入上述的两行代 码,就可以达到使该窗体始终位于屏幕最上面的目的。细心的读者可能已经发现上面的例子中的模块声 明中声明了好几个常量,可为什么只用到三个呢?现 在您可以试着改变一下API函数SetWindowPos中 的第二个参数或常量FLAGS中的项,看看您的窗体会 出现什么样的效果?2VB5中如何屏蔽掉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 LongPublic Const SPI_SCREENSAVERRUNNING=97在窗体的代码编辑区Copy如下代码:使三组热键失效Private Sub cmdDisable_click()SystemParametersInfoSPI_SCREENSAVERRUNNING,True,byVal 1&,0End SubPrivate Sub Form_Unload(Cancel As Integer)程序退出前是热键有效CndEnable_ClickEnd 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要用到的类 型NOTIFYICONDATAPublic Type NOTIFYICONDATAcdSize 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_ShellNIM_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 = vbMinimizedEnd With设置类型NOTIFYICONDATA所具有的特征With nidprogramData.cbSize = Len(nidProgramData).hwnd = Me.hwnd .uld = vbNull.uFlags = NIF_ICON Or NIF_TIP Or

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论