谈谈Windows API 在VB 中的应用

合集下载

32位Windows API在VB6中实现串行通信的技术分析

32位Windows API在VB6中实现串行通信的技术分析
P C硬 件 资 源 , 不 必 依 赖 于 MS D0S和 W i9 系 而 — n8
AP I是 附 带 在 W i9 n 8内 部 的 一 个 极 其 重 要 的 组 成 部 分 。 W i9 n 8的 3 2位 API主 要 是 一 系 列 很 复
杂 的 函 数 、 息 的 集 合 。 它 可 以 看 作 是 Wi9 消 n 8系 统
【 关键词】 A I串行通信; B P; V6
Te h ia a y i n 3 一 i W i d wsAPIt c nc l An lsso 2 b t no o
Re l e S —a mmu i to n VB6 a i e lCo z nc in i a
AP 接 口是 对 VB功 能 的 最 重 要 的 扩 充 。 几 乎 I
统 服 务 。 可 以 说 , 是 借 助 于 AP 正 I使 得 VB既 能 隐 藏 大 部 分 Wi d ws编 程 的 难 点 , 时 又 提 供 了 使 用 no 同
Wid ws 境 的 灵 活 性 。 no 环
维普资讯 http:/Байду номын сангаас
第6 卷第 3 期 20 年 9 06 月
河北职 业技术学院学报
J OURNAL OF HEB EIPOLYT ECHNI C COL LEGE
3 Wi sA 在 VB 中 2位 o I n w P d 6
因 而 在 串 行 通 信 中 使 用 调 用 API接 口 的 方 法 是 实 现 在 VB中 直 接 控 制 串 行 口硬 件 的 简 便 可 行 的
【 e od 】 A I sr mmu i t n VB K yw rs P; i c e ao l n i; 6 a c o [ 中图分类号]T 3 6 P 1 [ 文献标识码 ]A [ 文章编号]17 —1 1 (O 6 0 —0 1 —0 6 1 07 2o )3 0 9 2

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用胡文俊【期刊名称】《计算机时代》【年(卷),期】1998(000)002【摘要】Visual Basic以其灵活简便、易学易用的可视化的集成开发环境,面向对象以事件驱动的编程方法使Windows编程变得轻松自如、快速高效。

现在虽有不少其它开发工具,在某些性能、特点方面已接近甚至超过VB,但VB的应用是最成熟的,客观地讲,VB不是最好的,也不可能有最好的。

关于它的不足只要进行适当的扩充,对于大多数需求还是能很好地达到目的。

尤其是Windows API提供的数百个接口函数,很多“VB的不足”都可得到很好地解决。

这里,通过用API函数SendMessage对VB进行的一些扩充实例给读者一点启示,用足用活Windows API扩展VB功能,加速应用程序的建立。

一、添加列表框控体的水平滚动条 VB 中列表框控体(List box)只能设置垂直滚动条(VScroll),而没有提供水平滚动条(HScroll)。

这样,当包含于列表框内的文本长度超出列表框边缘宽度时,超出部分就不能显示。

这时,为List box控体增加水平滚动条就很有必要。

通过使用Windows API函数SendMessage可以解决这一问题。

函数SendMessage通过调用参数LB—SETHORIZONTALEXTENT比较列表框与其所包含的文本宽度(像素值)重新设置列表框,如果文本宽度大于列表框宽度,则显示水平滚动条,否则水平滚动条不起作用。

在Forml中创建列表框Listl和按钮Commandl,并相应地加入?【总页数】2页(P25-26)【作者】胡文俊【作者单位】无【正文语种】中文【中图分类】TP311【相关文献】1.让VB用足用活WindowsAPI调用 [J], 胡文俊2.VB调用WindowsAPI函数的方法 [J], 闵联营3.用好用足用活RCEP助力福建自贸区形成"双循环"新发展格局 [J], 董建东4.明确"五个意识"抓实"三个环节"——用足、用好、用活《语文作业本》策略谈 [J], 周颖5.用足用好用活生物学教材,有效落实学科核心素养--以《生物学·必修1·分子与细胞》为例 [J], 周湘因版权原因,仅展示原文概要,查看原文内容请购买。

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧

VBA中调用API函数的方法和技巧VBA(Visual Basic for Applications)是一种用于微软Office应用程序的编程语言,它提供了许多强大的功能和工具,可以增强Office程序的自动化和扩展性。

在VBA中,调用API函数是一种常见的方式,可以让我们使用计算机系统提供的底层功能,以实现更高级的操作。

本文将介绍VBA中调用API函数的方法和技巧,以帮助您更好地使用VBA进行编程。

1. 了解API函数的基本概念API(Application Programming Interface)是一组定义了程序之间交互方式的规范。

通过调用API函数,我们可以利用操作系统或其他程序提供的功能,而无需自己编写底层代码。

VBA中的API函数是以动态链接库(DLL)的形式提供的,这些DLL文件通常包含了许多函数和过程,可以供我们进行调用。

2. 查找所需的API函数在VBA中调用API函数之前,我们需要先找到需要使用的API函数及其所属的DLL文件。

可以通过以下几种方式来查找:- 在Microsoft的官方文档中查找:Microsoft提供了许多API函数的文档,可以在其网站上找到对应的函数说明和示例代码。

- 在互联网上搜索:许多技术论坛和网站都提供了关于API函数的使用方法和示例代码。

可以通过搜索引擎来寻找相关的资源。

- 使用API查找工具:有一些第三方工具可以帮助我们查找API函数及其所属的DLL文件。

例如,Dependency Walker是一个常用的工具,可以查看DLL文件中包含的函数和模块。

3. 声明API函数在VBA中调用API函数之前,我们需要先声明这些函数,以告诉编译器它们的名称、参数和返回值的类型。

声明API函数的语法如下:```vbaPrivate Declare Function 函数名 Lib "DLL文件名" (参数列表) As 返回值类型```其中,函数名是API函数的名称,DLL文件名是包含该函数的DLL文件的名称,参数列表是函数的参数及其类型,返回值类型是函数的返回值类型。

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料

在VB中使用API函数(之一)VB-电脑资料在VB 中使用API函数(之一) 什么是API? API(Advanced Programmers Interface,高级程序员接口)(注:API实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制 Windows 的各个部件(从桌面在VB中使用API函数 (之一)什么是API?API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.这在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.VB在这方面作了很多工作.它完全隐藏了API并且提供了在Windows环境下编程的一种完全不同的方法.这也就是说,你用VB写出的每行代码都会被VB转换为API函数传递给Windows.例如,Form1.Print...VB 将会以一定的参数(你的代码中提供的,或是默认参数)调用TextOut 这个API函数.同样,当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体(这对于你来说是隐藏的),VB获取这个调用并经过分析后生成一个特定事件(Button_Click).API函数包含在Windows系统目录下的动态连接库文件中(如User32.dll,GDI32.dll,Shell32.dll...).API 声明正如在"什么是API"中所说,API函数包含在位于系统目录下的DLL 文件中.你可以自己输入API函数的声明,但VB提供了一种更简单的方法,即使用API Text Viewer.要想在你的工程中声明API函数,只需运行API Text Viewer,打开Win32api.txt(或.MDB如果你已经把它转换成了数据库的话,这样可以加快速度.注:微软的这个文件有很多的不足,你可以试一下本站提供下载的api32.txt),选择"声明",找到所需函数,点击"添加(Add)"并"复制(Copy)",然后粘贴(Paste)到你的工程里.使用预定义的常量和类型也是同样的方法.你将会遇到一些问题:假设你想在你的窗体模块中声明一个函数.粘贴然后运行,VB会告诉你:编译错误...Declare 语句不允许作为类或对象模块中的Public 成员...看起来很糟糕,其实你需要做的只是在声明前面添加一个Private(如Private Declare Function...).--不要忘了,可是这将使该函数只在该窗体模块可用.在有些情况下,你会得到"不明确的名称"这样的提示,这是因为函数.常量或其他的什么东西共用了一个名称.由于绝大多数的函数(也可能是全部,我没有验证过)都进行了别名化,亦即意味着你可以通过Alias子句使用其它的而不是他们原有的名称,你只需简单地改变一下函数名称而它仍然可以正常运行.你可以通过查看VB的Declare语句帮助主题来获取有关Alias的详细说明.消息(Messages)好了,现在你已经知道什么是API函数了,但你也一定听说过消息(如果你还没有,你很快就会)并且想知道它是什么.消息是Windows告诉你的程序发生了哪些事件或要求执行特定操作的基本方法.例如,当用户点击一个按钮,移动鼠标,或是向文本框中键入文字时,一条消息就会被发送给你的窗体.所有发送的消息都有四个参数--一个窗口句柄(hwnd),一个消息编号(msg)还有两个32位长度(Long)的参数.hwnd即要接受消息的一个窗口的句柄,msg即消息的标识符(编号).该标识符是指引发消息的动作类型(如移动鼠标),另外两个参数是该消息的附加参数(例如当鼠标移动时光标的当前位置)但是,当消息发送给你时你为什么看不到呢--就象有人在偷你的信一样?请先别恼火,让我告诉你.小偷其实是Visual Basic.但它并没有偷走你的信,而是在阅读了之后挑出重要的以一种好的方式告诉你.这种方式就是你代码中的事件(Event).这样,当用户在你的窗体上移动鼠标时,Windows会发送一条WM_MOUSEMOVE消息给你的窗口,VB得到这条消息以及它的参数并运行你在事件MouseMove中的代码,同时VB会把这条消息的第二个32位数(它包含了x,y坐标,单位为像素(Pixel),每个位16位)转换为两个单精度数,单位为缇(Twip).现在,如果你需要光标坐标的像素表示,然而VB已经把它转换成了缇,因此你需要重新把它转换为以像素为单位.在这里,Windows给了你所需要的,但VB"好意地"进行了转换而使你不得不重新转换.你可能会问--我难道不能自己接收消息吗?答案是肯定的,你可以使用一种叫做子类处理(Subclass)的方法.但你除非必须否则最好不要使用,因为这与VB 的安全程序设计有一点点的违背.(注:子类处理确实有很大的风险,但如果使用得当,是很有用处的.不过有一点一定要注意,即千万不要使用VB 的断点调试功能,这可能会导致VB崩溃!)需要补充说明的是:你可以发送消息给你自己的窗口或其他的窗口,只需调用SendMessage或PostMessage(SendMessage会使接受到消息的窗口立刻处理消息,而PostMessage是把消息发送到一个称为消息队列的队列中去,等候处理(它将会在该消息处理完后返回,例如有些延迟)).你必须制定接受消息的窗口的句柄,欲发送消息的编号(所有的消息的编号均为常量,你可以通过API Text Viewer查得)以及两个32位的参数.。

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明

VBA调用系统API函数的方法与实例说明VBA(Visual Basic for Applications)是一种基于Microsoft Visual Basic语言的宏编程语言,主要用于操作Microsoft Office软件中的各种功能。

尽管VBA本身提供了丰富的功能,但有时候我们可能需要调用操作系统的API函数来实现一些高级或特定的功能。

本文将详细介绍VBA调用系统API函数的方法,并提供一些实例说明。

在VBA中调用系统API函数可以拓展VBA的功能,并且提供了解决复杂问题的能力。

使用API函数可以与操作系统进行交互,访问底层功能和资源。

以下是一些常用的VBA调用系统API函数的方法:1. 声明API函数在使用API函数之前,我们需要在VBA中声明该函数。

声明API函数的语法如下:```Declare Function 函数名 Lib "库名称" ([alias]] [参数列表]) [返回值类型]```其中,函数名是要调用的API函数的名称,Lib是API 函数所在的库名称,参数列表是API函数的输入参数,返回值类型是API函数的返回值类型。

2. 调用API函数一旦我们声明了API函数,就可以在VBA代码中调用该函数。

调用API函数的语法如下:```变量名 = 函数名([参数列表])```其中,变量名是接收API函数返回值的变量名,函数名是已声明的API函数的名称,参数列表是传递给API函数的参数列表。

3. 释放资源在调用API函数之后,我们需要确保适当地释放相关资源以避免内存泄漏。

可以使用相关的API函数来释放资源,如CloseHandle函数释放句柄资源。

现在让我们通过几个实例来说明如何在VBA中调用系统API函数:1. 调用MessageBox函数MessageBox函数用于显示一个包含指定消息和按钮的模态对话框,并返回用户的操作。

下面的代码演示了如何在VBA中调用MessageBox函数:```vbaDeclare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hWnd As Long, _ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As LongSub ShowMessageBox()Dim prompt As StringDim title As StringDim result As Longprompt = "这是一个提示框!"title = "提示"result = MessageBox(0, prompt, title, 1)End Sub```在上述代码中,我们首先声明了MessageBox函数,然后在Sub过程ShowMessageBox中调用了该函数。

在VBA中使用WindowsAPI

在VBA中使用WindowsAPI

在VBA中使⽤WindowsAPIVBA是⼀种强⼤的编程语⾔,可⽤于⾃定义Microsoft Office解决⽅案。

通过使⽤VBA处理⼀个或多个Office应⽤程序对象模型,可以容易地修改Office应⽤程序的功能或者能够使两个或多个Office应⽤程序协同⼯作以完成单个应⽤程序⽆法完成的任务。

然⽽,使⽤VBA仅能控制操作系统的⼀⼩部分。

Windows API提供了控制操作系统绝⼤多数⽅⾯的功能。

下⾯,介绍在VBA中使⽤Windows API的⼀些知识。

理解APIsAPI只是⼀组函数,可⽤于处理组件、应⽤程序或操作系统。

通常,API由⼀个或多个提供某种特定功能的DLLs组成。

DLLs是包含函数的⽂件,能够从任何运⾏的Windows应⽤程序中调⽤DLLs。

在运⾏时,DLL中的函数被动态链接到调⽤它的应⽤程序⾥。

⽆论多少应⽤程序调⽤DLL中的函数,该函数仅存在于磁盘的单个⽂件中,并且DLL在内存中仅被创建⼀次。

您可能最经常听说的API是Windows API,它包括组成Windows操作系统的DLLs。

每个Windows应⽤程序都直接或间接地与Windows API相交互,Windows API确保运⾏在Windows下的所有应⽤程序都按⼀致的⽅式⼯作。

除了Windows API外,还有其它发布的APIs可⽤。

例如,邮件应⽤程序编程接⼝(MAPI)是⼀组⽤于编写电⼦邮件应⽤程序的DLLs。

APIs通常是由创建Windows应⽤程序的C和C++程序员编写,但能够使⽤VBA调⽤DLL中的函数。

因为⼤多数DLLs最初都是由C/C++程序员编写和⽂档规范,所以调⽤DLL函数与调⽤VBA函数不同。

为了使⽤API,必需理解如何传递参数到DLL函数。

为了调⽤Windows API中的函数,需要描述这些可⽤的函数的⽂档规范,如何在VBA中声明这些函数,以及如何调⽤它们。

下⾯是两个有⽤的资源:1、Win32API.txt⽂件,包含Windows API中⼤多数函数的VBA Declare(声明)语句。

在VB中使用API函数(之二)VB-电脑资料

在VB中使用API函数(之二)VB-电脑资料

在VB中使用API函数(之二)VB-电脑资料在VB中使用API函数(之二) Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节 Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用在VB中使用API函数 (之二)Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValueScreen.TwipsPerPixelXPixelYValue=TwipYValueScreen.TwipsPerPixelYTwipXValue=PixelXValue*Screen.TwipsPerPixelXTwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" "(整除) 而不是 " / " ,这是因为像素值必须是整数.另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等.从哪里得到有关函数的说明?这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档.为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自 VBBooks Online(标题是:C语言声明到Visual Basic的转换)Books Online(标题是:C语言声明到Visual Basic的转换)C 语言数据类型在VB中的声明 Call withATOM ByVal variable As Integer An expression that evaluates to an IntegerBOOL ByVal variable As Long An expression that evaluates to a LongBYTE ByVal variable As Byte An expression that evaluates toa ByteCHAR ByVal variable As Byte An expression that evaluates to a ByteCOLORREF ByVal variable As Long An expression that evaluates to a LongDWORD ByVal variable As Long An expression that evaluates to a LongHWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long An expression that evaluates to a LongINT, UINT ByVal variable As Long An expression that evaluates to a LongLONG ByVal variable As Long An expression that evaluates to a LongLPARAM ByVal variable As Long An expression that evaluates to a LongLPDWORD variable As Long An expression that evaluates to a LongLPINT, LPUINT variable As Long An expression that evaluates to a LongLPRECT variable As type Any variable of that user-defined typeLPSTR, LPCSTR ByVal variable As String An expression that evaluates to a StringLPVOID variable As Any Any variable (use ByVal when passing a string)LPWORD variable As Integer An expression that evaluates to an IntegerLRESULT ByVal variable As Long An expression that evaluates to a LongNULL As Any orByVal variable As Long ByVal Nothing orByVal 0& or vb NullStringSHORT ByVal variable As Integer An expression that evaluates to an IntegerVOID Sub procedure Not applicableWORD ByVal variable As Integer An expression that evaluates to an IntegerWPARAM ByVal variable As Long An expression that evaluates to a Long注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True).HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long 而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD 实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在VB 中把它声明为 SUB.。

API函数在VB中的应用

API函数在VB中的应用
API函数在VB中的应用
所谓API就是“应用程序接口”(Application Programing Interface),是一些用C语言编写,由操作系统自身调用的函数。Windows API函数由许多“动态链接库”或DLL组成。在32位Windows中,核心的Windows
API DLL有如下一些:
Dim lResult As Long
sBuffer = String$(255,0)
lResult = GetWindowsDirectory(sBuffer, Len(sBuffer))
Windir = Trim(sBuffer)
Procs = Left(Windir, lResult) & "\rundll32.exe shell32.dll,SHFormatDrive"
End SuB
2.然后用鼠标右击窗体,选择右键菜单中的“添加/添加模块”选项,然后在出现的选择框中选择“模块”类型,接着在出现的模块代码输入框中加入以下X%, y%,0,0, SWP_NOZORDER Or SWP_NOSIZE)
DoEvents
End Sub
程序的执行
程序输入完成后,点击VB“运行”菜单中的“启动”或“全面编译”命令,点击“软盘格式化”按钮后选择要格式化的容量,即可对3.5英寸盘进行格式化操作。
程序的编写
1.与上例相同,首先运行VB,新建一个标准工程,然后利用“工具箱”在Form1窗体中加入一个命令按钮对象,将该命令按钮属性中的Caption值定义为“软盘格式化”。完成之后双击该按钮,在代码输入框中输入以下代码:
Private Sub Command1_Click()

Win Api在VB中的妙用

Win Api在VB中的妙用
Win Api在VB中的妙用
Windows API作为一套功能强大的应用程序接口,使VB可以实现对Windows底层的控制,完成VB不具有的功能。下面介绍几种使用API函数的方法。
一、制作特殊窗口
1.各种形状的窗口(仅给出了函数名,具体定义可以查阅API Viewer)
1)CreateEllipticRgn 建立一个椭圆形的区域;
3.透明窗口
去年的《电脑报》上提供了一个制作透明窗口的办法,这里再介绍另一种方法:
Private Sub Form1_Load()
Dim p As Long
p = GetWindowLong(hWnd,GWLEX
STYLE) ′取得当前窗口属性
SetWindowLong hWnd, GWL_EXSTY
Declare Function SystemParametersInfo Lib ″user32″ Alias “SystemParametersInfoA” (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long
笔者经过反复思考,终于恍然大悟:看到黑体的“ByVal”了吗?问题就出在这里。原来该函数使用的lpvParam 参数应该按地址传送而非按值传送,然而VB Viewer 中使用的是按值传送,所以会出现错误提示。
(福建 桃花岛主)
本文出自:《电脑报》1999年03月22日第11期
Me.Refresh ′刷新窗口
End Sub
2.浮动窗口
Delphi中实现浮动窗口非常容易,只要在属性栏中设置就可以。用VB实现就只有借助于API函数:

VBA调用Windows API的实用技巧和方法

VBA调用Windows API的实用技巧和方法

VBA调用Windows API的实用技巧和方法VBA(Visual Basic for Applications)是一种用于微软Office套件中的宏语言,它允许用户通过编写程序来增强Office应用程序的功能。

尽管VBA的功能已经非常强大,但是有时候我们可能需要超越其自身的限制,这就需要使用Windows API(Application Programming Interface)来扩展VBA的功能。

本文将介绍一些VBA调用Windows API的实用技巧和方法,以帮助您更好地利用VBA的潜力。

Windows API是由操作系统提供的一套功能和程序接口,它允许开发者直接访问底层操作系统的功能。

通过调用Windows API,我们可以实现一些在VBA中无法直接实现的功能,比如文件操作、窗口操作以及系统信息获取等。

以下是一些常用的VBA调用Windows API的实用技巧和方法:1.声明API函数:在VBA中,我们需要使用Declare语句来声明调用的Windows API函数。

声明函数需要指定函数的名称、返回值类型、参数类型及个数。

例如,如果我们想要获取当前系统的用户名,可以使用以下代码:```vbaDeclare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, ByRef nSize As Long) As Long```2.调用API函数:在声明完API函数后,我们可以使用VBA代码调用这些函数。

调用函数需要传递相应的参数,并接收返回值(如果有)。

以获取当前系统的用户名为例,可以使用以下代码:```vbaDim userName As StringDim bufferSize As LongbufferSize = 255userName = Space(bufferSize)Call GetUserName(userName, bufferSize)userName = Trim(Left(userName, InStr(userName, Chr(0)) - 1))MsgBox "当前用户的用户名为:" & userName```3.处理返回值:在调用Windows API函数后,我们需要适当地处理返回值。

在VB中使用API函数

在VB中使用API函数

在VB中使用API函数在VB中,可以使用API函数来实现一些高级功能或者与操作系统进行交互。

API(Application Programming Interface)是操作系统提供给开发人员的一组函数和接口,可以通过调用这些函数和接口来访问操作系统的底层功能。

1. 调用Windows API函数获取系统时间使用`GetSystemTime`函数可以获取当前系统的时间信息。

```vbPrivate Type SYSTEMTIMEwYear As IntegerwMonth As IntegerwDayOfWeek As IntegerwDay As IntegerwHour As IntegerwMinute As IntegerwSecond As IntegerwMilliseconds As IntegerEnd TypePrivate Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME)Private Sub GetTimeDim sysTime As SYSTEMTIMEGetSystemTime sysTimeMsgBox "Current Time: " & sysTime.wHour & ":" &sysTime.wMinute & ":" & sysTime.wSecondEnd Sub```2. 调用Windows API函数显示消息框使用`MessageBox`函数可以显示一个消息框。

```vbPrivate 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 ShowMessageDim result As Longresult = MessageBox(0, "Hello World!", "Message", vbInformation)If result = 1 ThenMsgBox "User clicked OK"ElseMsgBox "User clicked Cancel"End IfEnd Sub```3. 调用Windows API函数实现全屏显示使用`ShowWindow`函数可以设置应用程序窗口的显示状态。

在VB中使用API函数详解

在VB中使用API函数详解

在VB中使用API函数详解API(Advanced Programmers Interface,高级程序员接口)(注:API 实际是指Application Programming Interface,应用程序编程接口;此处疑为原文错误,不过在VB中也可以这么说吧!)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.用户的每个动作都会引发一个或几个函数的运行以Windows告诉发生了什么.一、什么是API? API(Application Programming Interface,应用程序编程接口)是一套用来控制Windows的各个部件(从桌面的外观到位一个新进程分配的内存)的外观和行为的一套预先定义的Windows函数.在某种程度上很象Windows的天然代码.其他的语言只是提供一种能自动而且更容易的访问API的方法.二、Windows的一些特别之处Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.三、Any 四、回调(CallBacks) 五、子类处理Windows的一些特别之处这个主题是要告诉你Windows 的一些与在VB中的不同的细节Windows通过句柄(Handle)识别每个窗体,控件,菜单,菜单项或其他任何你能想得到的东西.当你的程序运行时,它所包含的每个部件都有一个唯一确定的句柄用来同其他的部件相区别.例如,某个按钮得句柄就与其他部件不同,当你想要通过API来执行有关该按钮的某种操作时就必须使用这个句柄.从哪儿得到它呢?VB 为每个拥有Windows句柄的控件都提供了Hwnd属性来表示其句柄.Windows 使用像素(Pixel)而不是缇(Twip).因此,把涉及API函数调用的控件的ScaleMode属性设为3--(Pixel)是个不错的主意,这样你可以通过ScaleXXX属性得到它们的公制单位值.尽管这样,你可能有时仍需要进行从Twip到Pixel的转换(反之亦然),你可以通过Screen对象的TwipsPerPixelX和TwipsPerPixelY来实现.举例如下:PixelXValue=TwipXValue\Screen.TwipsPerPixelX PixelYValue=TwipYValue\Screen.TwipsPerPixelY TwipXValue=PixelXValue*Screen.TwipsPerPixelX TwipYValue=PixelYValue*Screen.TwipsPerPixelY我并没有在实际中见到过TwipsPerPixelX 和TwipsPerPixelY 的值有什么不同,但你最好是把它们区别开来而不是混用,这至少是一种好的程序设计风格.另外需要注意的是,这里用的是" \ "(整除) 而不是 " / " ,这是因为像素值必须是整数. 另外需要提到的是,Windows函数中用到了不同的坐标系统,因此需要注意.Windows的一些特别之处最后要注意的是,一旦你使用了API 函数,VB就可能不再可靠了---API调用中一个简单的语法错误就会导致VB 崩溃!(请经常保存您的工程).VB 并不能识别API调用中的错误,因此一旦你的程序出现异常,要先检查API调用---是否缺少 ByVal,或者是错误的类型,参数等等. 从哪里得到有关函数的说明? 这个主题不会告诉你如何通过API函数改变按钮文字或如何快速查找一个文件.这不是一个API函数文档. 为了得到有关函数的说明,你需要SDK帮助或微软的SDK文档(至少有40M---我怎么可能放在这里?).这些SDK帮助通常都包含在Borland Dephli 3.0 开发包或者MS Visual C++中.到网上去或找您的朋友要一个,版本越新越好注意Win3.x 的SDK 帮助对你并没有用,因为很多函数已经过于陈旧甚至废弃不用,尽管他们中的大多数由于与 Windows95兼容而依然存在.API参数类型如果你已经有了一个SDK帮助,你肯定主意到了函数的返回之或参数有很多奇怪的类型如VOID,LPCSTR, 和DWORD.如果你对C语言比较熟悉的话,那你肯定明白它们的意思.对于其他不熟悉C语言的人,这里有一张摘自VB Books Online(标题是:C语言声明到Visual Basic的转换) Books Online(标题是:C语言声明到Visual Basic的转换) <> bordercolordark="#FFFFFF" cellpadding="0">API参数类型注释:你应该注意到了BOOL类型(Boolean)求出的值为Long而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True). HWND,HDC,HMENU,etc.---etc.指其他所有与于前面所述相似的类型.它们都以"H"开头来表示不同对象的句柄.举例来说,HBITMAP表示一副位图的句柄,HBRUSH标是一个刷子的句柄等等.它们均为Long而且要按值传递(ByVal).同样要注意LPVOID被声明为Any型变量,本文将会有独立的一个主题用来论述Any类型.有些类型以"LP"开头.LP 是Long Pointer的缩写.因此LPWORD 实际表示数据所存的内存地址.不过,你并没有必要调用某个函数来获取这个地址.当你按引用(ByRef)传递参数时,你实际上传递的就是它的地址.在这里你只需记住:如果某个参数的类型以"LP"开头,应该按引用(ByRef)传递.顺便说一句,LPARAM 与Lparam 很相似但不是Lparam,Lparam不是一个指针,在这里你必须传递它的真实值,因此要按值(ByVal)传递.NULL也是一种奇怪的类型.你可以从VB 中了解到有关它的描述,这里我不去讨论它.按你需要的形式传递它吧,在大多数情况下,可以用ByVal 0& 或 vbNullString.最后,VOID是用来指那些没有返回值的函数的.API中没有SUBs,这就是它们的标志.只要记住:如果一个函数被声明为VOID ,你必须在VB 中把它声明为 SUBAny有些消息的参数声明为Any.这表示该参数是一种可变的类型(你可以以整型,字符串,用户自定义或其他的类型来传递). 这有一个这样的例子:Public Declare Function SendMessage Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long lParam 声明为Any 并按引用(ByRef)传递.这里是在这个函数中如果lParam是不同类型的值时应遵循的规则: 如果该值是传递形式numeric ByVal(as Long,or as Any) Null ByVal(as Long,or as Any) String ByRef(as String,or as Any) Type ByRef(as Any) array of Type ByRef(as Any)如果你的函数声明同上面的一个而且你想传递一个Long型数,你应该这样写:Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue) 注意尽管头三个参数也是数值,但它们前边并没有ByVal.这是因为在函数声明中它们已经被声明为按值传递(ByVal).第四个参数,由于是按引用传递(ByRef)(VB并不知道你要传递参数的类型),因此你必须加上ByVal 你可以使用别名技术来传递不同类型的参数:Public Declare Function SendMessageLng Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long或:Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long注意API参数类型本身是不会改变的.例子中的第四个参数总是一个4字节的长型数.当你按值(ByVal)传递一个Long或Null时,该4字节长的数值就直接传递给函数.如果你传递一个String或其他的什么,你是按引用(ByRef)传递,VB传递的实际上是变量的地址,也是4个字节.参数传递你已经知道如何传递参数了,只需把他放到调用的函数中即刻.然而,当你使用API函数时,在传递参数是有一些你应该注意的细节. ByVal还是ByRef. 通常情况下,你不用为此担心,VB的API浏览器已经为你做好了一切,只需你输入数值它就会照所声明的方式传递.总的来说,ByVal是把实际的数值传递给函数,而ByRef是把地址传给函数.唯一的麻烦就是Any 类型. 把字符串传递给API函数也并不难.API函数需要的是字符串首字符的地址,然后读取该地址直到遇到一个Null字符.听起来很糟糕,但只是VB处理字符串的实际方法.你唯一要记住的是一定要按引用传递(ByRef)字符串当你想得到所需的函数返回值信息时,情况有稍微的一点不同. 这里是GetComputerName函数的声明: Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long第一个参数是一个指向字符串的远程指针,第二个参数是字符串的长度.如果你只是简单的声明一个字符串类型的变量并把它传递给函数,就会出现错误.因此,你首先需要初始化字符串.这里是如何得到计算机名字的例子:Dim Buffer As String Buffer = Space(255) Ret& = GetComputerName(Buffer, Len(Buffer)) if Ret& > 0 thenCompName$ = Left(Buffer, Ret&)在这里,待传递的字符串被初始化为有255个空格的字符串.我们把它传递给函数同时还有它的长度.如果出错则返回值为0.参数传递CompName中将保存计算机名. 有些函数也需要传递数组,这里是一个例子:Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long最后两个参数是Long型数组.为了传递数组,你只需传递它的第一个元素.下面是示例代码:Const COLOR_ACTIVECAPTION = 2 Const COLOR_INACTIVECAPTION = 3Const COLOR_CAPTIONTEXT = 9Const COLOR_INACTIVECAPTIONTEXT = 19Dim SysColor(3) As Long Dim ColorValues(3) As LongDim Ret& SysColor(0) = COLOR_ACTIVECAPTIONSysColor(1) = COLOR_INACTIVECAPTIONSysColor(2) = COLOR_CAPTIONTEXTSysColor(3) = COLOR_INACTIVECAPTIONTEXT ColorValues(0) = RGB(58, 158, 58) ’深绿ColorValues(1) = RGB(93, 193, 93) ’浅绿ColorValues(2) = 0 ’黑色ColorValues(3) = RGB(126, 126, 126) ’灰色 Ret& = SetSysColors(4&, SysColor(0), ColorValues(0)) 该程序将改变所有活动和非活动窗口的标题栏背景和文本的颜色.回调(CallBacks)所谓回调,就是你自己定义一个函数,并告诉Windows何时为何调用.你可以写一个有特定数量和类型参数的函数,然后告诉Windows何时调用,并传递给它所需的参数.Windows就会调用你定义的函数,处理参数,并给你返回值.回调的一个典型应用是从Windows获得连续的数据流.这里是一个需要回调的函数的声明:Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long 第一个参数是你的回调函数的地址,第二个参数是你想传递的的任意数值.该值将被传递到你的函数,于是你就知道了它要调用什么.VB 5.0已经提供了一个很有用的操作符AddressOf ,可以得到一个函数的地址.当你调用一个函数时它只能用在参数的前面,下面这种用法是错误的并且会导致出错: FuncP = AddressOf MyFunction 因此你必须这样调用EnumWindows函数: Success& = EnumWindows(AddressOf cbFunc, 58&) 你必须也要自己写回调函数.问题是有很多不同类别的回调并且有各种各样的参数,有关这些参数的描述可以在SDK帮助或MS SDK文档中找到.这里是一个回调的声明:Function cbFunc (ByVal Hwnd, ByVal lParam) as Long这里是一个回调的例子:Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long Success& = EnumWindows(AddressOf cbFunc, 58&)Function cbFunc (ByVal Hwnd, ByVal lParam) as LongIf lParam = 58 then ’enum windows Str$ = Space(255) Ret& = GetWindowText(Str$, Len(Str$))Debug.Print Left(Str$, Ret&)End IfEnd Function这个例子将列出窗口的标题,(不包含子窗体)窗口程序Windows并不知道事件. 这些是VB特有的隐藏Windows获取你的窗口发生事件的真正方法的一种方式.VB很像是一个将Windows语言翻译成VB语言的解释器.但是事实并非如此,你很快就会遇到.设想你想知道用户何时加亮了菜单选项(不是点击,只是加亮即选择了)VB并不提供这种事件,但你可能见到其他的程序,但你浏览它的菜单时状态栏会出现相应的文字.如果他们能,你为何不能?OK,这里是大致的真实情况.每个窗口都有一个特殊的程序叫做窗口程序.它实际上是一个回调函数.该函数将在你的窗口发生事件的任何时间发送消息.这样当用户加亮一个菜单项时就会发送一条消息(WM_COMMAND).那为什么我看不到这条消息呢?这是因为是VB创建窗口程序而不是你.当Windows发送消息时,该程序将为之分派特定的事件,并将其参数转换为比较容易用的事件的参数.但是在有些情况下,它会忽略有些消息而不能收到真实的输入.如果你真的想得到这些消息,你必须对你的窗体进行子类处理,我们将在另外一个主题中谈到.这里是一个回调窗口程序的声明:Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long 第一个参数指定窗口的句柄,第二个参数是消息的标识符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam时两个32位的数值,它们的意义依赖于消息的类型.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理当你一最大限度利用了VB所给你的并且还想知道更多的东西,或只是想更多地了解你自己的窗口,你将会发现子类处理的优势.子类处理是指用一个新的窗口函数来取代当前活动窗口函数.这个用户自定义函数能处理任何需要的消息,并能调用原来的窗口函数,它将在原来的窗口函数之前收到各种消息.但原来的那个窗口处理函数依然存在,并没有消失.如果你不想处理某条消息,你应该让原来的窗口函数去处理它.子类处理是通过调用SetWindowLong函数实现的,该函数将改变指定窗口的特殊属性.下面是它的声明:Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex AsLong,ByVal dwNewLong As Long) As Long第一个参数代表要进行子类处理的窗口,第二个参数应该是GWL_WNDPROC(-4),第三个参数是新的窗口函数的地址.参见回调和窗口函数一节. 此函数将在窗口取得焦点,发生事件,或其他情况下(如其他进程改变了系统的某些参数)被随时调用. 如果发生错误SetWindowLong函数将返回0,否则将返回原来的窗口函数的地址.这个地址特别重要,你应该把它保存在一个变量中或其他地方.当你不处理某些消息时(实际上,你可能只处理不到1%的消息,其他的都将由原窗口函数处理),调用原来的窗口函数就需要该地址.子类处理调用原窗口函数将由CallWindowProc来完成.这里是它的声明: Declare Function CallWindowProc Lib "user32" Alias"CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long第一个参数是原窗口函数的地址,其他的同你接收到的四个参数一样.你可以改变其中的值来控制对消息的处理.例如,当你收到了一条WM_MOUSEMOVE消息时,你从lParam中得到鼠标所在位置的坐标并将其改成了其他的坐标.那么原窗口函数就会认为鼠标位于其他的位置从而做出一些有趣的事如显示其他控件的Tooltip.你指定的返回值也是有意义的,它依赖于发送的消息. 在结束你的程序时将控制权交回给原窗口函数是很重要的,通常在Form_Unload中完成如下: Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress) 如果你在VB中启动程序时忘掉了这一行,结果将是VB崩溃并会丢失尚未保存的数据.千万要小心.这里是子类处理的一个简单示例:Dim oldWndProc As LongPrivate Sub Form_Load()oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)End SubPrivate Sub Form_Unload()Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)End SubFunction MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)Debug.Print wMsg & " " & wParam & " " & lParam Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam) End Function处理参数有时函数并不以你所需的方式返回信息.一个典型的例子是将两个代表鼠标位置的整形(2 byte)数合并为一个4 Byte的数.还有一个例子是判断一个数的某位是否为1.你还可能得到一个代表一个结构地址的Long型数.合并和分离一个数并不需要过多的描述.你能在我们的网站(/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多种函数. 可以用一下方法检查一个数的第N位是否为1: If Value and (2^N) then ... 置1 Value = Value Or 2^N 置0 Value = Value And Not 2^N如果你想设定或取得预先知道的某位的信息,用1024代替2^10要快的多.因为这样VB无需自己进行计算(VB憎恨 "^" ?).如果你接收到一个类型的指针,你要做的工作将稍多一点.你可以使用CopyMem函数来取得信息.下面是它的声明: Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 如果你接收到了一个指向RECT 类型的指针并存在Long型变量Addr 中,可以这样处理: Dim Info As Rect Call CopyMem(Info, ByVal Addr, len(Info)) 注意ByVal 关键字.现在,如果你想把信息写回,使用: Call CopyMem(ByVal Addr, Info, Len(Info))结束语我希望这份教程能帮助你理解如何控制API函数的威力和如何正确使用它们.但是要小心!就像火,如果你让它失去控制,你就会玩蛋.当然,不要忘了VB是进行简单.安全程序设计的语言,而API函数则正好相反.如果你想得到更多的控制功能,最好转移到VC++ 或者Delphi. 祝你在API探险中好运!。

基于VB的WindowsAPI函数应用

基于VB的WindowsAPI函数应用

end_mm l oIn s . lin 1 2 ; 取分end_ss= l oIn s . lin 2 ; 取秒MediaPIayel1-> al Pos =(s al_mm*60+s al_ss *1000; 开始播放位置MediaPIayel1->endPos =(end_mm*60+end_ss *1000; 结束播放位置MediaPIayel1->PIay( ; 播放}4结束语将MP3文件作为存放有声读物的数据库文件 利用其同步字幕功能 便于对数据的查找定位 如果再添加对MP3文件的记录添加 删除 插入 修改等功能 就可以很好地应用于各种有声读物软件及嵌入式有声电子产品的开发应用上参考文献![1]林福宗 多媒体技术基础 清华大学出版社.2001[2]汪勇熊前兴 MP3文件格式解析 计算机应用与软件 200 .12[3]刘光 C++B iIdel 程序设计导学 清华大学出版社 2002.5收稿日期 2005年6月1引言随着计算机软件技术的不断发展 在Windows 平台上出现了许多优秀的可视化编程语言 诸如VB VCDeIphi 等 这些可视化编程语言的开发环境界面友好操作简单 并提供了大量的类库和各种控件工具 采用 所见即所得 的编程方式就可以开发出功能强大的Windows 应用程序由于VB 编程语言在程序的功能和执行效率上有其自身的局限性 在对于实现比较复杂和特殊的Win !dows 功能来说 就显得束手无策 这时就需要调用Windos API 函数来实现2API 函数的概念API 是操作系统自带的一套功能强大的函数集 Windows API 即应用程序接口C AppIica ion Plo lam In ! elface D 是Windows 系统提供给应用程序与操作系统的接口 是构筑整个Windows 系统框架的基石 在下与Windows 操作系统核心联系 在上又面向Windows 的应用程序 API 实际上是一些用C 语言编写由操作系统自身调用的函数 用来控制Windows 的各个部件外观和行为Windows API 根据操作系统的不同 可分为Win !dows 16API C 应用于16位操作系统D 和Windows 32API C 应用于32位操作系统D Windows 32API 函数组包括1500个API 函数 就具体的操作系统而言 Win32API 主要包含在Windows 动态链接库文件C Dynamic Link Li laly DLL D 中 即Usel32.dII KelneI32.dII 和GDI32.dII 其中Usel32.dII 中的函数主要用于窗口管理 KelneI32.dII 中的函数主要用于系统服务 而GDI32.dII 主要用于图形设备接口3API 函数在VB 开发中的应用3.1VB 中API 函数的声明鲁世斌安徽理工大学232001基于VB 的Windows API 函数应用摘要!API 函数介于操作系统核心和Windows 应用程序之间!能够直接控制和处理计算机的系统参数和硬件资源!实现许多高级功能"通过具体实例!阐述了在VB 中调用API 函数的方法"关键词!API 函数#VB #应用中图分类号!TP399文献标识码!AApplication of Windows API Function Based on VBLU Shi-binAn-ui University of Science and Technology ,-uainan 232001,ChinaAbstract !API function intervenes between the operating system kernel and the windows application programmmes,can directly control and porcess the computer system parameter and the hardware resources,and realize many senior func !tions.This paper elaborates the method of tranfering Windows API function based on VB by giving some examples.Key Words !API Function #VB #Application56在VB中使用API函数时必须在使用前先加以说明因为Windows API函数不是VB的内部函数并且API函数所用到的常量也必须加以声明O API函数常量及自定义类型的定义均放在VB所提供的Win32api. txt文件中只需从此文件中选出必要的定义然后复制到程序中就可以了O当然最好的方法是用VB自带API 浏览器使用过程如下1I首先选取VB菜单的外接程序/外接程序管理器然后选取外接程序管理器对话框中的VB6 API Viewer选项并选中加载/卸载及在启动中加载选项最后按下确定按钮接着VB的外接程序菜单栏底下会出现API浏览器的菜单O2第一次执行API浏览器时需要用菜单的文件/加载文本文件的选项载入Winapi目录下的Win32api.txt接着在API类型部分选择常数声明和类型的选项之一后在可选项部分中会分别列出Win32api.txt之中的所有常数API定义语句或自定义类型 O3如果想引用可用项部分的项目可能是常数API定义语句或自定义类型则选取之后按添加按钮该项目即会出现在选定项部分中此时按下复制按钮可将选取的函数定义复制到剪贴板接着回到VB开发环境在选取菜单的编辑/粘贴即可将所选择的项目内容从剪贴板复制过来O3.2API函数调用实例通过两个具体实例说明在VB中如何调用API函数O实例一隐藏和显示任务栏本例通过调用API函数中的FindWindow和SetWindowPos两个函数来控制任务栏的显示和隐藏程序中SWP_HIDEWINDOW和SWP_SHOWWINDOW 两个常量分别控制任务栏的隐藏和显示O设计步骤1l创建一个标准EXE工程添加一个模块在moduiel模块中添加以下代码1Option ExpiicitDeciare Function FindWindow Lib"user32"Aiias" FindWindowA"(ByVai ipCiassName As String,ByVai ip! WindowName As String)As LongDeciare Function SetWindowPos Lib"user32"(By! Vai hwnd As Long,ByVai hWndInsertAfter As Long,By! Vai x As Long,ByVai y As Long,ByVai cx As Long,By! Vai cy As Long,ByVai wFiags As Long)As Long Pubiic Const SWP_HIDEWINDOW=SHS0Pubiic Const SWP_SHOWWINDOW=SH402在Forml窗口的Commandl_Ciick处理程序中添加如下代码1Private Sub Commandl_Ciick()Taskbarhwn=FindWindow("Sheii_traywnd","")'得到任务栏句柄Caii SetWindowPos(Taskbarhwn,0,0,0,0,0, SWP_HIDEWINDOW)'隐藏任务栏End Sub3在Forml窗口的Command3_Ciick处理程序中添加如下代码1Private Sub Command2_Ciick()Taskbarhwn=FindWindow("Sheii_traywnd","")'得到任务栏句柄Caii SetWindowPos(Taskbarhwn,0,0,0,0,0, SWP_SHOWWINDOW)'显示任务栏End Sub4在Forml窗口的Command4_Ciick处理程序中添加如下代码1Private Sub Command3_Ciick()EndEnd Sub程序运行界面如图l所示O实例二拖动无标题栏的窗口一般无标题栏的窗口时不能拖动的而下面这个例子通过调用API函数中的ReieaseCapture函数和Sendmessage函数来拖动无标题栏窗口O设计步骤1l创建一个标准EXE工程注意1Forml的Bor! derStyie属性在设计时设为0即窗口无标题栏在Forml窗口的声明中加入以下代码1Const HTCAPTION=2Const Wm_NCLBUTTONDOWN=SHAlPrivate Deciare Function ReieaseCapture Lib"us! er32"()As LongPrivate Deciare Function Sendmessage Lib"user32" Aiias"SendmessageA"(ByVai hwnd As Long,ByVai wmsg As Long,ByVai wParam As Long,iParam As Long) As Long2在Forml窗口的Form_mouseDown处理程序中加入以下代码1!"Plivate Sub Folm_MouseDown(button As Integel, Shift As Integel,X As Singie,Y As Singie)Dim l As LongDim iIf Button=l Theni=ReieaseCaptule()l=Sendmessage(hwnd,Wm_NCLBUTTONDOWN, HTCAPTION,0)End IfEnd Sub(3)在Folml窗口的Commandl_Ciick处理程序中加如下代码Plivate Sub Commandl_Ciick()EndEnd Sub程序运行界面如图2所示0图!无标题栏窗口上述程序用中文版visuai Basic6.0在Windows Xp 平台下运行通过04调用Apl函数时要注意的事项作为封装了部分Windows API函数得vB编程环境9在获取高效率的同时9也牺牲了一些API的功能0调用API时稍有不甚可能导致API编程错误9出现难于捕获或间歇性错误9严重时出现程序崩溃0为减少API编程错误9提高vB调用API函数时的安全性9应重点注意下列几个问题(l)指定C Option Expiicit$编程前最好将vB编程环境中的C Reguile valiabie Decialation(要求变量声明)$项选中0如果该项未被指定9任何简单的录入错误都可能产生一个C valiant$变量9在调用API时9vB对该变量进行强制转换以免冲突9这样一来9vB就会字符串\长整型\整数\浮点数等各种类型传递NULL值9导致程序无法正常运行0(2)勿忘Byvai9确保函数声明的完整性Byvai是C按值$调用9传递参数时9不是将指向DLL的指针传递给参数变量本身9而是将传递的参数值拷贝一份给DLL0比如传递字符串参数时9vB与DLL之间的接口支持两种类型的字符串9如未使用Byvai关键字9vB 将指向DLL的函数指针传递给一个OLE2.0字符串(即BSTR数据类型)9而Windows API函数往往不支持这种数据类型9导致错误0而使用Byvai关键字后vB将字符串转换成C语言格式的C空终止$串9能被API函数正确调用0(3)注意检查参数类型API错误中9除了因遗漏Byvai关键字导致的错误外9还有是因为声明中有不正确的参数类型0如果声明的参数类型不同9被vB视为valiant传递给API函数9会出现C错误的DLL调用规范$的消息0(4)跟踪检查参数\返回类型和返回值vB具有立即模式和单步调试功能9利用这个优势9确保函数声明的类型明确(API步返回valiant类型)9通过跟踪和检查参数的来源及类型9可以排除参数的错误传递0若要对返回结果进行测试9用vB的Ell对象的LastDiiEllol方法可查阅这些信息9对错误可针对API 函数调用9取回API函数GetiastEllol的结果9以修改声明9达到正确调用API函数的目的0(S)预先初始化字符串9以免造成冲突如果API函数要求一个指向缓冲区的指针9以便从中载入数据9而此时传递的是字符串变量9应该先初始化字符串长度0因为API无法知道字符串的长度0没有初始化字符串9分配给字符串的缓冲区有可能会不足9API函数将有可能在缓冲区末尾反复改写9内存里字符串后面的内容将会改写得一塌糊涂0程序表现为突然终止或间歇性错误0除此之外9使用API函数时运行前最好先存盘9仔细检查调用API函数的参数与声明的类型是否一致9以及严格检查参数是否有效9都能减少引发错误或系统崩溃05结束语vB以简单易学\界面友好9而成为学习计算机编程的首选语9几乎可以完成所有Windows应用程序的编写0然而由于vB自身的局限性9要想直接控制和处理计算机的系统参数和硬件资源9实现一些高级功能9就必须通过调用Windows API函数9以便增强vB的编程功能9开发出更加高效9功能更加强大的应用程序0参考文献:[l]邱仲潘!visuai Basic6.0从入门到精通!北京电子工业出版社!l999[2]吴师通!visuai Basic实用编程白例!北京清华大学出版社92000![3]求是科技!visuai Basic6.0程序设计于开发大全!北京人民邮电出版社!2004收稿日期200S年6月!"。

如何在VB中利用Windows API调用其它应用程序

如何在VB中利用Windows API调用其它应用程序

如何在VB中利用Windows API调用其它应用程序
李光师
【期刊名称】《鞍山师范学院学报》
【年(卷),期】2004(006)002
【摘要】介绍了Windows API相关的一些基础知识和基本功能,论述了在VB中启动其它应用程序的几种方法及它们适用的情况,最后举出在VB中调用三个不同的API函数启动应用程序的实例并加以分析.
【总页数】3页(P69-71)
【作者】李光师
【作者单位】鞍山师范学院,计算中心,辽宁,鞍山,114005
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.在VB中调用API函数截获Windows消息 [J], 王忠贵
2.在VB中调用Windows API函数 [J], 任文进;刘建都
3.Windows应用程序开发中若干重要API函数的调用 [J], 陈健
4.VB中调用Windows API函数检测当前系统环境 [J], 李鸥
5.在VB中调用Windows API函数Bitblt()实现图象位操作 [J], 王道守
因版权原因,仅展示原文概要,查看原文内容请购买。

谈Windows API 在VB 中的应用

谈Windows API 在VB 中的应用

谈Windows API 在VB 中的应用
牛丽萍;刘燕
【期刊名称】《新乡学院学报(社会科学版)》
【年(卷),期】2002(016)002
【摘要】介绍了API函数并讨论了在VB中使用API函数的必要性,最后举例说明API在VB中的应用.
【总页数】2页(P42-43)
【作者】牛丽萍;刘燕
【作者单位】新乡师范高等专科学校,计算机科学系,河南,新乡,453000;新乡医学院,计算机教研室,河南,新乡,453003
【正文语种】中文
【中图分类】G431
【相关文献】
1.VB程序在Win32 API及Windows消息开发中的应用 [J], 陈勇孝;陆宜清
2.如何在VB6.0中应用Windows API进行编程 [J], 吴文庆
3.如何在VB中利用Windows API调用其它应用程序 [J], 李光师
4.巧用Windows API函数实现特殊功能——API在VB中的应用 [J], 丛迎九
5.VB中Windows API在图形隐现设计中的应用 [J], 王非
因版权原因,仅展示原文概要,查看原文内容请购买。

API函数在VB程序开发中的应用

API函数在VB程序开发中的应用

API函数在VB程序开发中的应用
徐东升;李娜;袁飞云
【期刊名称】《商洛学院学报》
【年(卷),期】2003(017)004
【摘要】在VB的应用程序开发中一些高级功能的实现必须借助于API函数.本文介绍了在VB应用程序开发中调用API函数的方法,并给出一个菜单项目前添加图标的实例加以说明.
【总页数】3页(P30-32)
【作者】徐东升;李娜;袁飞云
【作者单位】榆林学院计算机科学系,陕西,榆林,719000;商洛师范专科学校现代教育技术中心,陕西,商洛,726000;榆林学院计算机科学系,陕西,榆林,719000
【正文语种】中文
【中图分类】TP391
【相关文献】
1.API函数在VB中的应用研究 [J], 韩丽苹;杨晶
2.VB应用程序绵集(一):——API函数在VB中的应用(上) [J], 何发武;李卓
3.VB应用程序锦集(二):API函数在VB中的应用(下) [J], 何发武;李卓
4.Windows应用程序开发中若干重要API函数的调用 [J], 陈健
5.VB中API函数的应用 [J], 江石
因版权原因,仅展示原文概要,查看原文内容请购买。

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用

让VB用足用活WindowsAPI调用
胡文俊
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】1998(000)003
【摘要】目前,在微机操作系统中Windows是当之无愧的“霸主”,基于Windows平台的应用软件更是无所不在。

在开发工具方面,VisualBasic以其灵活
简便、易学易用的可视化的集成开发环境,面向对象以事件驱动的编程方法,第一次
使Windows编程变得如此轻松自如、快速高效,从而赢得了数百万程序员的青睐。

现在已有不少其它的开发工具,在某些性能、特点方面已接近甚至超过VB。

但不管怎样,在目前VB的应用是最成熟的。

【总页数】2页(P37-38)
【作者】胡文俊
【作者单位】浙江省金华市人民检察院
【正文语种】中文
【中图分类】TP316
【相关文献】
1.让VB用足用活WindowsAPI调用 [J], 胡文俊
2.VB调用WindowsAPI函数的方法 [J], 闵联营
3.用好用足用活RCEP助力福建自贸区形成"双循环"新发展格局 [J], 董建东
4.明确"五个意识"抓实"三个环节"
——用足、用好、用活《语文作业本》策略谈 [J], 周颖
5.用足用好用活生物学教材,有效落实学科核心素养--以《生物学·必修1·分子与细胞》为例 [J], 周湘
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

[摘 要] 本文首先讲述在VB中运用Windows API的一般方法,然后结合本人编程经验从界面编程、多媒体编程、系统编程等方面举例讲述API的实际应用,最后讲述VB中API应用应注意的问题以及解决办法。

Windows API(应用程序接口)是Windows 视窗系统提供给用户进行系统编程和外设控制的强大的应用程序接口,灵活运用好Windows API将使用户的程序更专业,功能更强大。

本文将从VB中API运用的一般方法、编程应用和应注意的问题及解决办法等三个方面讲述在VB中API的应用问题。

一、 VB中运用Windows API 的一般方法Windows API提供给用户成千上万个系统功能调用的函数,功能十分强大,灵活有效运用它,能使用户实际中遇到的许多棘手问题迎刃而解。

VB中没有提供直接调用API的功能,但VB中能通过声明API函数,从而有效使用API。

下面是关于VB中使用API的一般方法:1. 首先利用VB提供的API 浏览器查找到所需声明的API函数和常量定义,并复制该函数。

(注:若用户无API浏览器,也可以从\VB\WINAPI\Winapi32.txt中直接复制所需API函数。

)2. 然后在VB中新增一个模块,并将前面复制的API函数和常量定义复制到模块中。

3. 最后在VB程序中就可以象VB自身的函数一样运用API函数。

二、VB中Windows API的编程应用1.界面编程1)示例一:创建不规则窗体Win32 API 有很多让你意想不到的功能。

要创建特殊的不规则窗口看上去似乎很难。

但我们运用API,则几行代码就可以实现,这似乎不可思议。

但事实就是如此,不信看看吧!实现步骤:(1 ) 建立一个新项目文件DEMO1.PRJ;(2 ) 建立模块文件DEMO1.BAS.并在模块的声明部分加入以下代码:Private Declare Function CreatePolygonRgn Lib "gdi32"(lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As LongPrivate Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long'定义顶点结构Public Type POINTAPIX As LongY As LongEnd TypePublic Dim XYPOINT() As POINTAPI(3)在窗体Form1的Command1_Click处理程序中加入以下代码: Private Sub Command1_Click()'定义区域句柄Dim hRgn As LongDim lRes As Long'定义T型顶点坐标数组ReDim XYPOINT(7) As POINTAPI 'T shape has 8 points'确定T型顶点坐标的值With MeXYPOINT(0).X = 0XYPOINT(0).Y = 0XYPOINT(1).X = .ScaleWidthXYPOINT(1).Y = 0XYPOINT(2).X = .ScaleWidthXYPOINT(2).Y = .ScaleHeight / 2XYPOINT(3).X = .ScaleWidth - (.ScaleWidth / 3) XYPOINT(3).Y = .ScaleHeight / 2XYPOINT(4).X = .ScaleWidth - (.ScaleWidth / 3) XYPOINT(4).Y = .ScaleHeightXYPOINT(5).X = .ScaleWidth / 3XYPOINT(5).Y = .ScaleHeightXYPOINT(6).X = .ScaleWidth / 3XYPOINT(6).Y = .ScaleHeight / 2XYPOINT(7).X = 0XYPOINT(7).Y = .ScaleHeight / 2End WithhRgn = CreatePolygonRgn(XYPOINT(0), 8, 1) lRes = SetWindowRgn(Me.hWnd, hRgn, True) Me.BackColor = vbBlueEnd Sub(4)在窗体的Form_Unload处理程序中加入代码:Private Sub Form1_DbClick()Unload MeEnd Sub运行效果如下图:2)示例二:游动的窗体朋友,您使用过Linux吗?如果您使用过的话,那么Linux中那只游动的可爱小企鹅,一定忘不了。

其实,该功能实现很简单,下面,笔者将带您一起来实现它。

实现步骤:1. 建立新项目文件DEMO2.PRJ;2. 建立模块文件DEMO2.BAS.并在模块中加入如下代码:Public Declare Function GetCursorPos Lib "user32" (lpPoint AsPOINTAPI) As LongPublic Type POINTAPIX As LongY As LongEnd TypePublic Oldx As LongPublic Oldy As LongPublic Newx As LongPublic Newy As LongPublic Pnt As POINTAPI3.在窗体上加入一个时间控件Timer1_Timer处理程序中加入如下代码: Private Sub Timer1_Timer()Me.SetFocusGetCursorPos PntOldx = Form1.LeftOldy = Form1.TopNewx = Pnt.X * 13.5Newy = Pnt.Y * 13.5incx = (Newx - Oldx) / 80 * 13.5incy = (Newy - Oldy) / 80 * 13.5Form1.Move Oldx + incx, Oldy + incyEnd Sub4.在Image1_DblClick处理程序中加入如下代码:Private Sub Image1_DblClick()Unload Me2.系统编程1)示例一:屏蔽CTRL+ALT+DEL键我们在编程中,为了达到特殊的要求,有时需要屏蔽功能CTRL+ALT+DLE,本示例程序将教你如何实现它。

实现步骤:1.建立一个新项目,将其命名为DEMO3.vbp。

2.在Form1窗体的声明中加入以下代码:Private Declare Function SystemParametersInfoLib "user32" Alias "SystemParametersInfoA"(ByVal uAction As Long, ByVal uParam As Long,ByRef lpvParam As Any, ByVal fuWinIni As Long)As LongConst SPI_SCREENSAVERRUNNING = 973. 在Form1窗口的Command1_Click中加入以下代码:Private Sub Command1_Click()Dim r As IntegerDim p As BooleanIf Command1.Caption = "屏蔽" Thenr =SystemParametersInfo(SPI_SCREENSAVERRUNNING,Command1.Caption = "有效"Elser =SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, p, 0)Command1.Caption = "屏蔽"End IfEnd Sub4. 在Form1窗体的Form_Unload中加入以下代码: Form1_Unload()Dim r As IntegerDim p As Booleanr =SystemParametersInfo(SPI_SCREENSAVERRUNNING, False, p, 0)运行效果如下图:2) 示例二:抓屏演示本示例程序将演示如何拷贝屏幕图象。

实现步骤:1. 建立一个新项目,将其命名为Demo4.vbp。

2. 增加模块Demo4.bas,在Demo4.bas中加入如下代码: Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPublic Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As LongPublic Const SRCCOPY = &HCC00203. 在窗体Form1的Command1_Click处理程序中加入以下代码: Private Sub Command1_Click()Dim i As LongDim wScreen As LongDim hscreen As LongDim w As LongDim h As LongPicture1.ClswScreen = Screen.Width \ Screen.TwipsPerPixelXhscreen = Screen.Height \ Screen.TwipsPerPixelYw = Picture1.ScaleWidthh = Picture1.ScaleHeighthdcScreen = GetDC(0)i = StretchBlt(Picture1.hdc, 0, 0, w, h, hdcScreen, 0, 0, wScreen, hscreen, vbSrcCopy)Picture1.RefreshEnd Sub运行效果如下图:3.多媒体编程:1) 示例一:百叶窗效果实现步骤:1.建立一个新项目,将其命名为Demo5.vbp。

相关文档
最新文档