Tasuta

Иcпользование API на Delphi 7

Tekst
Märgi loetuks
Šrift:Väiksem АаSuurem Aa

ЛЕКЦИЯ №7

1. API – ФУНКЦИИ WINDOWS УПРАВЛЕНИЯ ВНЕШНИМИ ПРИЛОЖЕНИЯМИ

API-функции – это набор стандартных функций операционной системы Windows, через которые можно программно управлять всеми запущенными программами и ресурсами компьютера. API-функции являются некоторым современным аналогом функциям-прерываниям INT21h MS-DOS. Возможность использовать данные функции в Делфи организуется через автоматически подключаемый модуль «Windows».

Для получения справки по API-функциям из Делфи необходимо выбрать пункт «Help > Windows SDK (Win32 Developer's References)». Данный хелп содержит подробную информацию о правилах вызова основных API- функций (синтаксис языка «С»).

Все визуальные компоненты Делфи, например «Edit, Label, Button» и др. являются окнами, как и форма. Для универсальной работы с любыми окнами используются дескрипторы (handle) окон. Дескриптор окна – это указатель на окно в виде целого числа (аналог порядкового номера), типа «HWND» (прототип «Integer»). При открытии любого окна (видимого или невидимого, типа формы или кнопки), Windows присваивает ему уникальный дескриптор. Данный указатель действителен до закрытия окна или перезагрузки Windows. Любому окну Windows может присвоить любой дескриптор.

Для того, чтобы узнать дескрипторы окон какой-либо программы, применяется программа «WinSight32» из пакета программ Delphi или другая подобная программа.


ПРИМЕР ВЫЗОВА API-ФУНКЦИИПОЯСНЕНИЕ (VAR H,H2:HWND; I: LONGWORD; S: STRING;)
GetWindowText(h, pchar(s),I);Получение текста из окна «h» в переменную «s» длиной не более «i» символов
i:=GetWindowtextLength(h);Получение длины текста из окна «h» в переменную «i»
SetWindowText(h, pchar(s));Установка текста «s» в окне «h»
h:=FindWindow(pchar(s),nil);Поиск дескриптора окна с именем класса «s» в переменную «h»
h2:=GetWindow(h, GW_CHILD);Поиск подчиненного окна «h2» для окна «h»
h2:=GetWindow(h, GW_HWNDNEXT);Поиск следующего подобного окна «h2» для окна «h»
If h=0 then WinExec(‘calc.exe’, SW_SHOWMODAL);Если искомое окно не найдено, то запустить указанную программу «calc.exe»
ShowWindow(h, SW_HIDE);Установить для окна «h» заданный режим отображения
ShowWindow(h, SW_MINIMIZE);Установить для окна «h» заданный режим отображения
ShowWindow(h, SHOWNORMAL);Установить для окна «h» заданный режим отображения
SetForegroundWindow(h);Поместить видимое на экране окно «h» поверх всех окон
SendMessage(h, WM_LBUTTONDOWN,0,0);Посылка окну «h» сообщение с параметрами (эмуляция нажатия левой кнопки мыши)
MoveWindow(h, 210,38,30,20,true);Задать окну «h» координаты x и y верхнего левого угла, ширину, высоту и флаг автоматической перерисовки окна
CloseWindow(h);Сворачивание окна «h»
PostMessage(h, WM_QUIT,0,0);Посылка сообщения для закрытия окна «h»
Edit1.Perform(WM_CHAR, byte(“!”),0);Посылка компоненту формы сообщения (эмуляция ввода символа в компонент, эмуляция нажатия стрелки вниз). Используется в собственных программах на Delphi
Combobox1.Perform(Посылка компоненту формы сообщения (эмуляция ввода символа в компонент, эмуляция нажатия стрелки вниз). Используется в собственных программах на Delphi
WM_KEYDOWN, VK_DOWN,0);
ShellExecute( handle, ’open’, ’c:\’, nil, nil, sw_shownormal)Открывает нужную папку в Проводнике
ShellExecute( Открывает документ «test.doc». Папка для временных файлов «c:\temp»
application.MainForm.handle, ’open’, ’test.doc’,
nil, ’c:\temp’, sw_shownormal)
ShellExecute( handle, ’open’, ’mailto: tsn_prof@mail.ru’, nil, nil, sw_shownormal)Открывает почтовый клиент для создания письма для заданного электронного адреса
ShellExecute(handle, ’open’, ’http://www.pau.kz’, nil, nil, sw_shownormal)Открывает Интернет-браузер для просмотра указанной WWW-страницы

2. ПРИМЕР РАБОТЫ С API-ФУНКЦИЯМИ

function GetText1(Wnd: HWND): string;

{ Получение текста из окна, способ 1 (универсальный) }

var textlength: Integer; Text: PChar;

begin

  textlength := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);

  if textlength = 0 then Result := '' else begin

     GetMem(Text, textlength + 1);

     SendMessage(Wnd, WM_GETTEXT, textlength + 1, Integer(Text));

     Result := Text;

     FreeMem(Text);

  end;

end;

function GetText2(h: HWND): string;

{ Получение текста из окна, способ 2 }

var i:LongWord; s:string;

begin

  i:=GetWindowTextLength(h)+1; SetLength(s,i);

  GetWindowText(h,pchar(s),i); SetLength(s,i-1);

  GetText2:=s;

end;

procedure SetTxt1 (h: HWND; s: string);

{ Установка текста в окне (универсальный) }

begin

 SendMessage(h,WM_SETTEXT,0, longint(pchar(s)));

end;

procedure SetTxt2 (h: HWND; s: string);

{ Установка текста в окне }

begin

  SetWindowText(h,pansichar(s));

end;

Procedure ClickWnd(h: HWND);

{ "Нажатие" на окно левой кнопкой мыши }

begin

  SendMessage(h,WM_LBUTTONDOWN,0,0);

  SendMessage(h,WM_LBUTTONUP,0,0);

end;

procedure ClickTB(h: HWND; BTN_ID: integer);

{ "Нажатие" на кнопку тулбара }

begin

  SendMessage(h, WM_COMMAND, BTN_ID, 0);

end;

procedure Button3Click(Sender: TObject);

{ Клик на кнопку "Добавить" в архиваторе "7z" }

var h: hwnd;

begin

  h:=Findwindow('FM',nil);

  if h=0 then winexec('C:\Program Files\7-Zip\7zFM.exe',sw_show);

  h:=Findwindow('FM',nil); sleep(1000);

  if h=0 then exit;

  SetForeGroundWindow(h);

  SetTxt2 (h,’ok’);

  MoveWindow(h,210,38,30,20,true);

  h:=GetWindow(h,gw_child);

  h:=GetWindow(h,gw_child);

  h:=GetWindow(h,GW_HWNDNEXT);

  ClickTB(h, 2000);

end;