Основы офисного программирования и язык VBA


Вызов функций Win32 API, работающих в Unicode кодировке - часть 2


  • FindWindow, которая позволяет найти окно по его заголовку, вернув описатель окна в качестве результата,
  • GetWindowText, SetWindowText, позволяющие получить и установить новый заголовок окна.

Заметим сразу же, что нам удалось успешно вызвать и корректно работать с двумя последними функциями в Unicode кодировке. Однако этот прием не работает при вызове функции FindWindowW. Несмотря на все попытки, переданная для поиска строка заголовка не приводила к успешному завершению поиска. Но обо всем по порядку. Приведем вначале раздел объявлений модуля с именем Unicode, созданного для работы с этим примером:

Option Explicit 'Объявление вызываемых функций в Unicode кодировке Public Declare Function FindWindowA Lib "user32" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'Функции в Unicode кодировке 'Тип string заменен на Any. Передача аргумента по ссылке Public Declare Function FindWindowW Lib "user32" _ (lpClassName As Any, lpWindowName As Any) As Long

Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextW" _ (ByVal hwnd As Long, lpString As Any, ByVal cch As Long) As Long

Public Declare Function SetWindowText Lib "user32" Alias "SetWindowTextW" _ (ByVal hwnd As Long, lpString As Any) As Long

Public ArCapt() As Byte 'Объявление динамического массива

Все пояснения уже сделаны и поэтому приведем процедуру этого модуля, вызывающую функции API:

Public Sub WorkWithUniFunc() Dim res As Long Dim Capt As String 'Заголовок 'Динамический массив байтов для передачи строки заголовка Dim HandleW As Long 'Описатель окна

'Поиск окна по заголовку Capt = "Document1 - Microsoft Word" HandleW = FindWindowA(vbNullString, Capt) If HandleW > 0 Then 'OK Debug.Print HandleW Else: MsgBox ("FindWindowA не может найти окно с заголовком" & vbCrLf & Capt) End If 'Попытки использовать для поиска Unicode функцию 'FindWindowW не увенчались успехом ' ReDim ArCapt(0 To 2 * VBA.Len(Capt)) As Byte ' ArCapt = Capt & vbNullChar ' Debug.Print ArCapt ' HandleW = FindWindowW(0&, ArCapt(0)) ' If HandleW > 0 Then 'OK ' Debug.Print HandleW ' Else: MsgBox ("Не могу вызвать UniCode FindWindowW") ' End If 'Получить заголовок окна ArCapt = VBA.String$(128, vbNullChar) res = GetWindowText(HandleW, ArCapt(0), 128) If res > 0 Then 'OK Debug.Print ArCapt Else: MsgBox ("не получен заголовок окна") End If




Начало  Назад  Вперед



Книжный магазин