第77集 API基础
367、 API概述
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
368、 API函数有什么作用?
Windows的行为是通过API函数的调用完成的,通过它可以控制windows部件的外观和行为。
369、 VBA等编程工具和API有什么关系?
VBA等编程工具是封装好的API函数命令集合,VBA代码运行时会调用API函数来实现需要完成的功能。我们使用编程工具其实是间接调用API函数。而VBA能间接调用只是一部分API函数,要实现一些VBA无法实现的功能,我们需要在VBA中直接调用API,而不是使用API函数封装好的某个函数或命令。
370、 API函数在哪里?
API函数是储存在系统目录下的链接库文件中(dll格式文件)。
371、 API函数怎么在VBA里使用?
1、声明API函数和参数用到的常量。
2、直接象VBA函数一样使用API函数。
372、 API函数声明解释
Public Declare Function GetSystemMetrics Lib “user32” (ByVal nIndex As Long) As Long
Public 把API函数声明为公用
Declare Function 这就是声明API函数的专用结构,没有为什么.用API就得用Declare声明一下.
GetSystemMetrics 函数名子,用函数总得提供函数名子吧.
Lib “user32” 在系统链接库中api函数不是放在固定的一个文件中,而是放在很多文件中.说出
这个API函数在哪个dll文件里,也是很有必要.
(ByVal nIndex As Long) 括号内是参数,函数一般都要有参数.当然也有不带参数的
As Long 是函数就要返回值,这是返回值的数据类型
373、 为什么要声明常量,不知道API函数和常量对应关系
Api函数有参数,那这些参数值我们该怎么设置呢? 这些参数的对应的常量值都是预设好的,而且会对应多个常量.象我们学过的end属性.它的参数XlDirection 可为 XlDirection 常量之一。
’ xlDown
’ xlToRight
’ xlToLeft
’ xlUp
上面这四个常量分别代表着不同的方向,而且他们是预设置的,只要用xlup就表示向上.API中的参数也是这样的道理,每个参数对应很多常量,不同的常量实现不同的功能.和API函数必须声明才可以用一样.这些常量也需要声明才可以用.
至于API函数和常量的对应关系,这个可以在微软MSDN站点和很多网站或API帮助里都可以查找API函数的相应帮助中查找到每个函数对应的常量有哪些.
百度搜索window api
或https://msdn.microsoft.com/zh-cn/library/windows/desktop/ff818516(v=vs.85).aspx右上角搜索
或下载MSDN安装到电脑上,在本地搜索
374、 完成一个功能需要很多个API函数,怎么知道要用哪些函数?
经常看到实现一个功能,需要使用到很多API函数。这个和EXCEL中使用函数一样,也经常要使用多个EXCEL函数才能实现想要的效果,至于一个功能要用到哪些API函数,一是要了解你要实现的功能需要哪些步骤,可能每个步骤都需要一个单独的API函数来实现,二是经验,用多了就熟悉了。
375、 句柄是什么?
我们可能会用API操作EXCEL窗口,VBA窗体等部件,在操作之前我们得先取得被操作对象的操作权。让API分辩出我们要操作的对象,可以用这个对象的一个ID来表示。在WINDOWS中每一个窗体和部件都分配有一个数字ID,它就是句柄。
知道操作对象的句柄就可以利用句柄来定位这个被操作的对象。
有的函数是指定了被操作的对象,就是为这个操作对象服务的,所以它不需要句柄这个参数,而有的函数是为更多操作对象服务的,所以为了区分是哪个,就需要给这个函数提供句柄。
376、 API声明从哪复制
在VB6.0企业版里面,有一个API文本浏览器,文件-加载文本文件-WIN32API。
377、 句柄操作
1 获得句柄的方法
用spy 软件直接获取
2 用Findwindow函数获得顶级句柄
Public Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
函数名; Findwindow
来自: user32.dll链接库
别名: FindWindowA
参数:
lpClassName 窗口的类名
lpWindowName 窗体标题
FindWindow(“XLMAIN”, Application.Caption) 返回excel程序的句柄
XLMAIN,excel程序的类名
Application.Caption excel程序的标题
常用的类:
XLMAIN Excel程序类
ThunderXFrame 插入的窗体类
Excel7 工作簿窗口类
Commbobox 组合框类
Edit 编辑框类
Button 按钮类
如果不知道类名,可以用vbNullString来表示忽略此选项,但要知道准确的窗口标题
3 用FindWindowEx获得子窗口句柄
Declare Function FindWindowEx Lib “user32” Alias “FindWindowExA” (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
hWnd1父窗口句柄
hWnd2从这个子窗体后开始查找符合条件的
4 利用属性获得
Application.hwnd 可以获得当前excel程序的句柄
378、 API区分64位和32位的office版本
对于要在 64 位 Microsoft Office 版本中运行的代码,所有 Declare 语句都必须包括 PtrSafe 关键字,并且将 Declare 语句中所有需要存储 64 位数的数据类型(参数和返回值)更新为使用 LongLong(对于 64 位整数)或 LongPtr(对于指针和句柄)。
带有 PtrSafe 关键字的 Declare 语句为建议的语法。要使包括 PtrSafe 的 Declare 语句能同时在 32 位和 64 位平台上的 VBA7 开发环境中正确运行,必须先将 Declare 语句中所有需要存储 64 位数的数据类型(参数和返回值)更新为使用 LongLong(对于 64 位整数)或 LongPtr(对于指针和句柄)。为确保与 VBA 版本 6 和更早版本的向后兼容性,请使用下面的构造:
#If Vba7 Then
Declare PtrSafe Sub…
#Else
Declare Sub…
#EndIf
示例:
#If VBA7 Then
'定义窗体样式64位office中
Private Declare PtrSafe Function FindWindow Lib “user32” Alias _
“FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SetWindowLong Lib “user32” Alias _
“SetWindowLongA” (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#Else
'定义窗体样式32位office中
Private Declare Function FindWindow Lib “user32” Alias _
“FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib “user32” Alias _
“SetWindowLongA” (ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
#End If
379、 示例1:Excel换图标
Option Explicit
Public Declare PtrSafe Function ExtractIcon Lib “shell32.dll” Alias “ExtractIconA” (ByVal hInst As Long, ByVal lpszExeFileName As String, ByVal nIconIndex As Long) As Long
Public Declare PtrSafe Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
Public Declare PtrSafe Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Const WM_SETICON = &H80
Public Const WM_SETTEXT = &HC
Sub Excel换图标()
Dim IconPath As Variant
Dim hIcon As Long, sr As String, k
IconPath = “D:\Program Files\Tencent\QQ\Bin\QQ.exe” 'ThisWorkbook.Path & “\MSN.ICO”
hIcon = ExtractIcon(0, IconPath, 0)
'SendMessage FindWindow(“XLMAIN”, Application.Caption), WM_SETICON, 1, hIcon
'SendMessage