免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
Board logo

標題: API 資料參考 [打印本頁]

作者: mhfo    時間: 2013-12-2 08:58     標題: API 資料參考

(一)前
   应用程序编程接口(Application Programming Intertace, 简称 API)是由操作系统支持的函数定义、参数定义和消息格式的集合 ,应用程序可借助 API 函数进行处理。API函数提供有Windows所执行的所有系统服务。API 中的图形设备接口(Graphics Device Interface , 简称GDI)提供了独立于设备的图形支持。通过GDI,Windows应用程序可以运行在各种不同的硬件平台上。

    随着可视编程环境的到来,程序员能采用拖放(drag and drop)方式来开发完美的全功能应用程序,它们界面友好,操作简便,在一定程度下替代了API的神秘功能。其实,在当今应用程序的类库和定制控制都是构筑在Windows API 的基础之上的,这些类库和函数加速了Windows应用程序的开发,但也导致了非常多的程序员在类库前面“故步自封”,对下层API函数的强大功能一无所知。

    但当前,如果程序员要编写符合当代标准的程序,则没有比理解API的性能更重要,虽然类库和定制控制使开发应用程序容易得多,但它们只触及到Microsoft的Windows系统功能的皮毛。程序员只有真正理解Windows API 的内涵,才能成功地扩展那些类库和可视开发环境 ,才能开发出功能更强、性能更优越的程序。
(二)API的数据类型和数据结构
函数命名规则:

函数名由一个动词后接一个名词组成,其中动词和名词的第一个字母必须大写。

数据类型:
数据类型
含  义

WORD
16位无符号整数

LONG
32位有符号整数

DWORD
无符号长整数

HANDLE
用作句柄的32位整数

HWND
用作窗口句柄的32位整数

UINT
32位无符号整数

BOOL
用作真值和假值

BYTE
8位无符号字符

PSTR
指向字符串的32位指针

PCSTR
指向字符串的常量指针


〈注〉:所谓句柄,实际上就是一个标识资源的值。Windows95 包含有许多句柄类型,如应用 程序实例、窗口、菜单、控件、输出设备、画笔 等等,所有句柄类型都以 H 打头,通过句柄,应用程序才能访问信息,才能借助系统完成实际工作,这是Windows95在多任务环境下保护信息的一种手段。

常用数据结构:

数据结构
描述

MSG
应用程序消息的结构

WNDCLASS
定义窗口类

PAINTSTRUCT
定义窗口用户域的绘制消息

RECT
定义矩形


例如:API函数InvalidateRect()的原型为:

Bool InvalidateRect( _

      HWND hwnd,_ //句柄,在此特指发送WM_PAINT消息的窗口句柄。

      CONST RECT *LPRECT _ //结构,在此特指要重画的窗口区域的坐标。

BOOL fErase)    //坐标见下

其中类型RECT又是一个结构,用于指定矩形区域的左上角和右下角的坐标,其定义为:

tyPedef tagRECT{

LONG left,top; //左上角坐标

LONG right,bottom; //右下角坐标

}RECT;

(三)API的调用方式
  VB对API函数的调用:
首先要在全局模块或窗体中申明要使用的函数或过程,然后像使用VB自身函数或过程一样,直接使用或用CALL调用即可。

声明格式如下:

Declare Function (或Sub) 函数名 Lib “DLL库名” [Alias “函数别名”] [(参数)] [As数据类型]

  这里有几点说明请大家注意:

1.  声明的地方有两点,用途有所不同。

在窗体的总体声明部分声明:

    该函数只能在此窗体内的过程或函数中使用,其它窗体则无法使用,而且需要在Declare前面加上Private, 否则VB将提示编译错误。

在全局模块中声明:
    Declare前面不加任何范围限制则可使用于整个程序,不再局限于某个窗体,最好加上Public,特别是API函数中需要的常数前面一定要加上 Public,否则有可能在别处无法使用。

2. 别名的使用:

  Alias表示别名,它主要是在需要调用的动态库中的函数和VB已有的保留字、函数或用户已定义的变量 或函数名字相同时使用,可以避免因名称相同带来麻烦。假如VB中已有AAA这个函数,而需要调用的动态库中的函数名也叫AAA,那么VB将不知道使用哪个AAA,从而出错。这时,我们就要为动态库中的AAA另起一个名字,例如给它一个别名BBB。这样,我们在程序中直接使用BBB就可以了,VB碰到BBB就自动会使用动态库中的AAA函数,而不是VB中的AAA函数。

      大小写问题:

      A、不需要别名时,函数名必须区分大小写,与API 原型相符。

      B、需要别名时,由于函数别名是和别名相对应的动态库中的真实的函数名,所以函数别名必须区分大小写,与API原型相符。(详见下面的例子)

3.  调用方式有两种:

     A、直接调用,注意调用时需先给变量定义

     B、CALL调用(详见下面的例子)

     下面以Windows函数FlashWindow(使给定的窗口闪烁一次)为例,介绍VB对Windows API的调用方式。

     FlashWindow 函数原型:

     BOOL FlashWindow(hwnd,fInvert)

    (注:其中hwnd 指待闪烁窗口的句柄,fInvert:非零表示闪烁。)

    VB声明:

    Private Declare Function AAA FlashWindow Lib “user32”    Alias “FlashWindow” (ByVal hwnd As Long, ByVal bInvert  As Long ) An Long

使用:abc=AAA(hwnd,CLng(True)) 开始闪烁 (直接调用方式)

或 Call AAA(hwnd,CLng(True)) (Call调用方式)

够不够详细?
---------------------------------------------------------------------------------
文本框用 SendMessage WM_GETTEXT 获取,按钮、静态文本用 GetWindowText获取。VB6、Delphi等的label需要Hook API拦截TextOut函数才能获取。

--------------------------------------------------------------------------------

Const MF_BYPOSITION = &H400&
Const MF_REMOVE = &H1000&
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long


Private Sub Form_Load()
    Dim H As Long, I As Long
   
    H = GetSystemMenu(Me.hwnd, False)


    If H Then
        I = GetMenuItemCount(H)
        If I Then
            RemoveMenu H, I - 1, MF_BYPOSITION Or MF_REMOVE
            RemoveMenu H, I - 2, MF_BYPOSITION Or MF_REMOVE
            DrawMenuBar Me.hwnd
         End If
    End If
End Sub


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If UnloadMode = 0 Then Cancel = True
End Sub




歡迎光臨 魚骨頭的雲端圖書館 (http://mhfo.hotbbs.info/) Powered by Discuz! 7.0.0