Win32 API. Основные сведения

Функции Win32 API - это функции, которые система Windows использует в своих целях и предоставляет другим языкам программирования пользоваться ими. Спектр применения этих функций весьма широк. Это работа с графикой, файлами, окнами и многое другое. Список функций применительно к VB можно посмотреть в поставляемом с VB файлом Win32Api.txt.
Для использования API функции в VB проекте ее нужно вначале объявить. Например
Declare Function SetCurrentDirectory Lib "kernel32" Alias _
"SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
SetCurrentDirectory - название функции в Вашей программе;
kernel32 - название библиотеки;
SetCurrentDirectoryA - действительное название функции в библиотеке;
Название функции в программе может отличаться от действительного названия функции. Также могут отличаться названия параметров. Главное, чтобы соблюдалась их очередность и тип. Например данную функцию можно объявить так:
Declare Function SetCurDir Lib "kernel32" Alias _
"SetCurrentDirectoryA" (ByVal PathName As String) As Long
Глобальными API функции можно объявлять только в модулях кода. В коде формы и модулях класса функции можно объявить только локальными:
Private Declare Function SetCurrentDirectory Lib "kernel32" Alias _
"SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
Возвращаемые значения обычно указываются в аргументах функции. Если функция должна нам возвратить строку, то мы должны предварительно выделить память под нее. Для этого мы должны передать в функцию строку с таким количеством символов (обычно пробелов), чтобы оно было больше или равно количеству возвращаемых символов в строке. Иногда дополнительно в функции есть параметр, в котором нужно указать явно число символов. Например:
Private Declare Function GetWindowsDirectory Lib "kernel32" _
Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long

Private Sub Form_Load()
Dim WinDir As String
Dim l As Integer
WinDir = Space$(144)
' После выполнения функции l будет содержать
' число символов в названии директории,
' WinDir будет содержать название директории+оставшиеся пробелы
l = GetWindowsDirectory(WinDir, 144)
' Отсекаем лишние пробелы
WinDir = Left$(WinDir, l)
MsgBox WinDir
End Sub
Иногда нужно передать в функцию адрес процедуры. Делается это с помощью оператора AddressOf. При этом процедура должна находиться в модуле кода. Например сделаем программу, которая выводит список контролов на Вашей форме. Добавьте на форму список List1, кнопку и несколько любых контролов. Добавьте в код формы следующий код
Private Sub Command1_Click()
' Функция EnumChildWindows возвращает список
' всех дочерних окон окна, указанного в параметре hwnd
' так как контролы тоже являются окнами,
' то эту функцию можно использовать для
' вывода всех контролов на форме
' Передаем в функцию описатель формы
' и адрес процедуры, которая будет рекурсивно
' вызвана столько раз, сколько контролов
' найдет функция EnumChildWindows
EnumChildWindows hwnd, AddressOf ChildWindowProc, 0
End Sub
Теперь добавьте в модуль кода
Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long _
, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Public Function ChildWindowProc(ByVal hwnd As Long, ByVal lp As Long) As Long
Dim Text As String
Dim l As Long
Text = Space$(144)
' Получаем название контрола
l = GetWindowText(hwnd, Text, 144)
' Добавляем в список название контрола и его описатель
Form1.List1.AddItem Left$(Text, l) + " hwnd=" + Str$(hwnd)
' Сообщаем, что вызов функции прошел успешно
ChildWindowProc = 1
End Function
Hosted by uCoz