Функции Windows API для работы с посторонними окнами

Существует большое количество статей на эту тему, но я все-таки хочу добавить к ним ещё одну. Эта статья будет посвящена функциям для работы с окнами (как Вы уже поняли из названия). Знатоки WinAPI, не судите меня за какие-либо ошибки или неточности, а лучше поправьте (e-mail:mailto:stalcom@ukr.net). Но, собственно, приступим к делу.

Прежде всего, я хочу сказать, что работа Windows основана на сообщениях. Так Windows посылает любому окну такие сообщения как (WM_PAINT,WM_ACTIVATE,WM_LBUTTONCLICK,…). Вы, вероятно, заметили, что каждое сообщение имеет префикс WM_ (Window Message). Окнами в Windows являются не только формы, но и кнопки, ListBox'ы, ComboBox'ы и т. п. Словом все компоненты, производные от класса TWinControl являются окнами. Сообщения, адресованные кнопкам, начинаются с префикса BM_ (например, BM_CLICK), а к спискам (ListBox) - LB_(LB_GETCOUNT).

Для работы с окнами Windows предоставляет большое количество функций, которые описаны в модуле Windows.pas, и экспортируются из Windows'овских библиотек (DLL - Dynamic Link Library). Конечно, в рамках одной статьи нельзя рассмотреть ВСЕ функции API, поэтому здесь будут рассмотрены только некоторые из них. Вот они:

BringWindowToTop - Выводит окно поверх других по Z-порядку
CloseWindow - Минимизирует (не закрывает) окно
EnableWindow - Делает окно доступным/недоступным
EnumChildWindows - Просматривает все дочерние окна
EnumWindows - Просматривает все главные окна
FindWindow - Ищет окно в системе
FindWindowEx - Ищет дочернее окно
GetClassName - Узнает имя класса заданного окна
GetClassLong - Узнает информацию о данном классе
GetClientRect - Достает Rect клиентской области окна
GetDesktopWindow - Возвращает дескриптор Desktop
GetForegroundWindow - Ищет верхнее окно системы
GetNextWindow - Находит следующее или предыдущее окно
GetWindow - Возвращает дескриптор окна, с заданным положением
GetDC - Ищет дисплейный контекст окна
GetWindowLong - Узнает информацию о заданном окне
GetWindowRect - Достает Rect всего окна
GetWindowText - Возвращает текст окна
GetWindowTextLength - Возвращает длину текста окна
GetWindowThreadProcessId - Узнает процесс, которому принадлежит заданное окно
IsChild - Дочернее ли окно
IsIconic - Свернуто ли окно
IsWindow - Есть ли такое окно в системе
IsWindowVisible - Видимое ли это окно
IsZoomed - Максимизировано ли это окно
MoveWindow - Перемещает окно
OpenIcon - Восстанавливает окно из иконки
SetForegroundWindow - Назначает верхнее окно системы
SetWindowLong - Устанавливает новые параметры окна
SetWindowPos - Устанавливает позицию окна
SetWindowText - Изменяет заголовок окна
ShowWindow - Показывает окно с заданными параметрами
WindowFromPoint - Возвращает окно из заданной позиции

В этой статье подробнее я постараюсь рассмотреть как можно больше функций. Давайте создадим приложение, которое будет использовать большинство из этих функций (При написании статьи я использовал Borland Delphi 6 Enterprise Build 6.163). Для начала создайте новое приложение и сразу сохраните его. Поместите на форму TreeView, и назовите его tvList, и PageControl. В PageControl'e создайте 4 страница с названиями:

Основная
Стиль окна
Расширенные стиль окна
Стиль класса окна
На основной странице будет 16 параметров, которые мы будем узнавать об окне. Вот они:
Заголовок
Класс
Дескриптор
Дескриптор меню
Иконка
HInstance
Заголовок родителя
Дескриптор родителя
Слева
Сверху
Высота
Ширина
Снизу
Справа
Дисплейный контекст
Идентификатор процесса.
Изменяемыми параметрами будут только все координаты, заголовок и иконка, напротив которых нужно поставить Edit'ы (кроме иконки естевственно), а остальные будут неизменяемыми, и напротив них можно поставить метки. Вот как начал я:

(Там где пусто, стоят метки)
На остальных трех страницах поместите ListView, и назовите их соответственно:

LvWndStyle
LvExWndStyle
LvClassStyle
Свойства ListView.CheckBoxes установите в True для каждого ListView.
И ещё, добавьте две кнопки SpeedButton (как на рисунке).
Теперь костяк готов, и можно приступать к самому интересному.

Сначала форма в стадии разработки:

Вот весь модуль (читайте комментарии):

unit UMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ComCtrls, StdCtrls, ExtCtrls, ExtDlgs, Menus;

type
TfmWinapi = class(TForm)
btnRefresh: TSpeedButton;
Label1: TLabel;
Label2: TLabel;
pcWndInfo: TPageControl;
tsMain: TTabSheet;
tsWndStyle: TTabSheet;
tsExWndStyle: TTabSheet;
tsClassStyle: TTabSheet;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel; //Метки параметров
Bevel1: TBevel;
edWText: TEdit;
lbWClass: TLabel;
lbWHandle: TLabel;
lbWHMenu: TLabel;
imWIcon: TImage;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Bevel8: TBevel;
Bevel9: TBevel;
Bevel10: TBevel;
Bevel11: TBevel;
Bevel12: TBevel;
Bevel13: TBevel;
Bevel14: TBevel;
Bevel18: TBevel;//Разделители
lbWHinst: TLabel;
edPWText: TEdit;
lbPWHandle: TLabel;
edWWidth: TEdit;
EdWHeight: TEdit;
edWTop: TEdit;
edWLeft: TEdit;
edWBottom: TEdit;
lbWProcId: TLabel;
lbWDC: TLabel;
edWRight: TEdit;
Label18: TLabel;
Bevel15: TBevel;
lvWndStyle: TListView;
lvExWndStyle: TListView;
lvClassStyle: TListView;
odIcon: TOpenPictureDialog;
btnApply: TSpeedButton;
tvList: TTreeView;
pmWIcon: TPopupMenu;
pmSave: TMenuItem;
sdIcon: TSavePictureDialog;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
procedure btnRefreshClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure tvListCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure tvListDblClick(Sender: TObject);
procedure pcWndInfoChanging(Sender: TObject; var AllowChange: Boolean);
procedure imWIconClick(Sender: TObject);
procedure btnApplyClick(Sender: TObject);
procedure pmSaveClick(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N9Click(Sender: TObject);
private
{ Private declarations }
public
procedure BuildTree;
procedure GetWindowParams(Wnd: HWND);
procedure GetWindowExParams(Wnd: HWND);
end;

var
fmWinapi: TfmWinapi;
tnCurrent: TTreeNode;
SelWindow: HWND;

implementation
var
SelDC: HDC;

NewStyle: LongInt;
NewExStyle: LongInt;
NewClassStyle: LongInt;

{$R *.dfm}

function GetIcon(wnd:hwnd):TIcon; //Достать иконку по хэндлу если это возможно
begin
result:=TIcon.Create; //Создаем иконку
result.Handle:=GetClassLong(wnd,GCL_HICON); //Пытаемся достать
end;

procedure SetIcon(wnd:hwnd; icon:TIcon); //Меняет иконку у окна
begin
postmessage(wnd,wm_seticon,0,icon.Handle);//Посылаем сообщение окну, содержащее
//хэндл иконки
end;

function GetText(wnd:hwnd):string; //Возвращает заголовок окна
var p:array [0..256] of char;
begin
with fmWinAPi do
GetWindowText(wnd,p,255);
result:=strpas(p);
end;

procedure TfmWinapi.GetWindowParams(Wnd: HWND); //Возвращает стили окна
var
I, WL: LongInt;

begin
WL:= GetWindowLong(wnd, GWL_STYLE); //Достаем стиль окна
for I:= 0 to lvWndStyle.Items.Count -1 do
if ((LongInt(lvWndStyle.Items[i].Data)) and WL) <> 0 then
lvWndStyle.Items[i].Checked:= True else lvWndStyle.Items[i].Checked:= False;
{Помечаем ту или иную птичку}

WL:= GetWindowLong(wnd, GWL_EXSTYLE); //Достаем расширенный стиль окна
for I:= 0 to lvExWndStyle.Items.Count -1 do
if ((LongInt(lvExWndStyle.Items[i].Data)) and WL) <> 0 then
lvExWndStyle.Items[i].Checked:= True else lvExWndStyle.Items[i].Checked:= False;

WL:= GetClassLong(wnd, GCL_STYLE); //Достаем стиль класса
for I:= 0 to lvClassStyle.Items.Count -1 do
if ((LongInt(lvClassStyle.Items[i].Data)) and WL) <> 0 then
lvClassStyle.Items[i].Checked:= True else lvClassStyle.Items[i].Checked:= False;
end;


procedure TfmWinapi.GetWindowExParams(Wnd: HWND);
var
PParam: array[0..127] of Char;
ProcId: LongInt;
hInst: THandle;
Rct: TRect;
Begin
{Заполняем основную страницу}
edWText.Text:= GetText(wnd); //Заголовок
GetClassName(wnd, PParam, 128); //Класс
lbWClass.caption:= StrPas(PParam);
lbWHandle.caption:= IntToStr(wnd); //Дескриптор
lbWHmenu.caption:=IntToStr(GetMenu(wnd));// Дескриптор меню
ImWIcon.Picture.Icon:=GetIcon(wnd); //Иконка
GetWindowText(GetParent(wnd), PParam, 127);//Заголовок родителя
EdPWText.text:= StrPas(PParam);
lbPWHandle.caption:= IntToStr(GetParent(wnd));Дескриптор родителя
GetWindowRect(Wnd, Rct);..Координаты
edWLeft.text:= IntToStr(Rct.Left);
edWTop.text:= IntToStr(Rct.Top);
edWWidth.text:= IntToStr(Rct.Right-Rct.Left);
edWHeight.text:= IntToStr(Rct.Bottom-Rct.Top);
edWRight.text:= IntToStr(Rct.Right);
edWBottom.text:= IntToStr(Rct.Bottom);
lbWDC.Caption:= IntToStr(SelDC); //Дисплейный контекст(DC или Canvas.Handle)
hInst:= GetWindowLong((wnd), GWL_HINSTANCE);//HInstance
lbWHinst.Caption:= IntToStr(hInst);
GetWindowThreadProcessId(wnd, @ProcId);//Идентификатор процесса
lbWProcId.Caption:= IntToStr(ProcId);

end;

function ChildTree(Handle: HWND; Info: Pointer): BOOL; stdcall;
{Функция для построения дерева дочерних окон}
var
Text: array [0..256] of Char;
tnParent: TTreeNode;
begin
GetWindowText(handle, text, 200);
if Text <> '' then
tnParent:= fmWinapi.tvList.Items.AddChildObject(tnCurrent, StrPas(Text),
TObject(Handle))
else begin
GetClassName(Handle,text,255);
tnParent:= fmWinapi.tvList.Items.AddChildObject(tnCurrent,text,
TObject(Handle));
end;
tnParent.ImageIndex:= 1;
tnParent.SelectedIndex:= 1;
Result:= True;
end;

function ParentTree(Handle: HWND; Info: Pointer): BOOL; stdcall;
{А это то же самое для родителей}
var
Text: array [0..256] of Char;
tnParent: TTreeNode;
begin
GetWindowText(handle, text, 200);
if (Text <> '') then
tnParent:= fmWinapi.tvList.Items.AddObject(nil, StrPas(Text),
TObject(Handle))
else begin
GetClassName(Handle,text,255);
tnParent:= fmWinapi.tvList.Items.AddObject(nil, text,
TObject(Handle));
end;
tnParent.ImageIndex:= 0;
tnParent.SelectedIndex:= 0;
Result:= True;
end;

procedure TfmWinapi.BuildTree; //Собственно сама процедура построения дерева
var
i: integer;
begin
tvList.Items.Clear;
EnumWindows(@ParentTree, 0);
for i:= 0 to tvList.Items.Count do begin
tnCurrent:= tvList.Items[i];
EnumChildWindows(Integer(tvList.Items[i].Data), @ChildTree, 0);
end;
end;

//Клик на кнопку "Обновить список"
procedure TfmWinapi.btnRefreshClick(Sender: TObject);
begin
BuildTree;
end;

procedure TfmWinapi.FormCreate(Sender: TObject);
var
ListItem: TListItem;
Begin
btnRefresh.Click;
//Здесь мы заполняем ListView. Можно было сделать это в Инспекторе объектов, кроме
//ListItem.Data. Поэтому я предпочел делать здесь
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_POPUP';
ListItem.Data:= TObject($80000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_CHILD';
ListItem.Data:= TObject($40000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_MINIMIZE';
ListItem.Data:= TObject($20000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_VISIBLE';
ListItem.Data:= TObject($10000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_DISABLED';
ListItem.Data:= TObject($8000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_CLIPSIBLINGS';
ListItem.Data:= TObject($4000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_CLIPCHILDREN';
ListItem.Data:= TObject($2000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_MAXIMIZE';
ListItem.Data:= TObject($1000000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_CAPTION';
ListItem.Data:= TObject($C00000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_BORDER';
ListItem.Data:= TObject($800000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_DLGFRAME';
ListItem.Data:= TObject($400000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_VSCROLL';
ListItem.Data:= TObject($200000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_HSCROLL';
ListItem.Data:= TObject($100000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_SYSMENU';
ListItem.Data:= TObject($80000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_THICKFRAME';
ListItem.Data:= TObject($40000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_GROUP';
ListItem.Data:= TObject($20000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_TABSTOP';
ListItem.Data:= TObject($10000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_MINIMIZEBOX';
ListItem.Data:= TObject($20000);
ListItem:= lvWndStyle.Items.Add; ListItem.Caption:= 'WS_MAXIMIZEBOX';
ListItem.Data:= TObject($10000);

ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_DLGMODALFRAME';
ListItem.Data:= TObject(1);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_NOPARENTNOTIFY';
ListItem.Data:= TObject(4);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_TOPMOST';
ListItem.Data:= TObject(8);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_ACCEPTFILES';
ListItem.Data:= TObject($10);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_TRANSPARENT';
ListItem.Data:= TObject($20);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_MDICHILD';
ListItem.Data:= TObject($40);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_TOOLWINDOW';
ListItem.Data:= TObject($80);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_WINDOWEDGE';
ListItem.Data:= TObject($100);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_CLIENTEDGE';
ListItem.Data:= TObject($200);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_CONTEXTHELP';
ListItem.Data:= TObject($400);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_RIGHT';
ListItem.Data:= TObject($1000);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_RTLREADING';
ListItem.Data:= TObject($2000);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_LEFTSCROLLBAR';
ListItem.Data:= TObject($4000);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_CONTROLPARENT';
ListItem.Data:= TObject($10000);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_STATICEDGE';
ListItem.Data:= TObject($20000);
ListItem:= lvExWndStyle.Items.Add; ListItem.Caption:= 'WS_EX_APPWINDOW';
ListItem.Data:= TObject($40000);

ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_VREDRAW';
ListItem.Data:= TObject(1);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_HREDRAW';
ListItem.Data:= TObject(2);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_KEYCVTWINDOW';
ListItem.Data:= TObject(4);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_DBLCLKS';
ListItem.Data:= TObject(8);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_OWNDC';
ListItem.Data:= TObject($20);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_CLASSDC';
ListItem.Data:= TObject($40);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_PARENTDC';
ListItem.Data:= TObject($80);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_NOKEYCVT';
ListItem.Data:= TObject($100);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_NOCLOSE';
ListItem.Data:= TObject($200);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_SAVEBITS';
ListItem.Data:= TObject($800);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_BYTEALIGNCLIENT';
ListItem.Data:= TObject($1000);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_BYTEALIGNWINDOW';
ListItem.Data:= TObject($2000);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_GLOBALCLASS';
ListItem.Data:= TObject($4000);
ListItem:= lvClassStyle.Items.Add; ListItem.Caption:= 'CS_IME';
ListItem.Data:= TObject($10000);

end;

procedure TfmWinapi.tvListCustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if IsWindowVisible(LongInt(Node.Data)) then Sender.Canvas.Font.Color:= clBlack
else Sender.Canvas.Font.Color:= clGray;
{Видимые окна рисуем как обычно, а нвидимые серым}
end;

procedure TfmWinapi.tvListDblClick(Sender: TObject);
begin
SelWindow:= LongInt(tvList.Selected.Data); //Даблклик на TreView. Выборка окна
selDC:=GetDC(SelWindow);
GetWindowParams(SelWindow);
GetWindowExParams(SelWindow);
end;

procedure TfmWinapi.pcWndInfoChanging(Sender: TObject;
var AllowChange: Boolean);
begin
if SelWIndow=0 then AllowChange:=false; //Если окно ещё не выбрано, то запретить
//преключаться
end;

procedure TfmWinapi.imWIconClick(Sender: TObject);//Клик на Image против иконки
begin
if imWIcon.Picture.Icon.Empty then Exit; //Если иконку не удалось достать, то аревуар
if odicon.Execute then
imWIcon.Picture.Icon.LoadFromFile(odicon.FileName);
end;

procedure TfmWinapi.btnApplyClick(Sender: TObject); //Применяем изменения
var i:integer;
begin
{Задаем новые стили}
NewStyle:= 0;
for i:= 0 to lvWndStyle.Items.Count -1 do begin
if lvWndStyle.Items[i].Checked then NewStyle:= NewStyle or
LongInt(lvWndStyle.Items[i].Data);
end;

NewExStyle:= 0;
for i:= 0 to lvExWndStyle.Items.Count -1 do begin
if lvExWndStyle.Items[i].Checked then NewExStyle:= NewExStyle or
LongInt(lvExWndStyle.Items[i].Data);
end;

NewClassStyle:= 0;
for i:= 0 to lvClassStyle.Items.Count -1 do begin
if lvClassStyle.Items[i].Checked then NewClassStyle:= NewClassStyle or
LongInt(lvClassStyle.Items[i].Data);
end;

SetWindowLong(SelWindow, GWL_STYLE, NewStyle);
SetWindowLong(SelWindow, GWL_EXSTYLE, NewExStyle);
SetClassLong(SelWindow, GCL_STYLE, NewClassStyle);

//Изменяем координаты и размеры окна

SetWindowPos(SelWindow, HWND_TOP, StrToInt(EdWLeft.Text),
StrToInt(EdWTop.Text), StrToInt(EdWWidth.Text),
StrToInt(EdWHeight.Text), SWP_FRAMECHANGED);
SetIcon(SelWindow,imWIcon.picture.icon); //Меняем иконку
end;

procedure TfmWinapi.pmSaveClick(Sender: TObject);
begin
if SdIcon.Execute then
imWIcon.Picture.Icon.SaveToFile(sdicon.FileName);
end;

procedure TfmWinapi.N2Click(Sender: TObject);
begin
CloseWindow(SelWindow);//Свернуть окно
end;

procedure TfmWinapi.N3Click(Sender: TObject);
begin
OpenIcon(SelWindow);//Восстановить
end;

procedure TfmWinapi.N4Click(Sender: TObject);
begin
ShowWindow(SelWindow,SW_MAXIMIZE);//Развернуть
end;

procedure TfmWinapi.N6Click(Sender: TObject);
begin
EnableWindow(SelWindow,False);//Запретить
end;

procedure TfmWinapi.N7Click(Sender: TObject);
begin
EnableWindow(SelWindow,True);//Разрешить
end;

procedure TfmWinapi.N10Click(Sender: TObject);
begin
ShowWindow(SelWindow,sw_hide);//Скрыть
end;

procedure TfmWinapi.N11Click(Sender: TObject);
begin
ShowWindow(SelWindow,sw_show);//Показать
end;

procedure TfmWinapi.N5Click(Sender: TObject);
begin
PostMessage(SelWindow,WM_QUIT,0,0);//Закрыть
end;

procedure TfmWinapi.N9Click(Sender: TObject);
begin
BuildTree;//Обновить
end;

end.

Вот это вроде и все. Надеюсь Вам пригодилась эта статья. Если будут какие-то вопросы или пожелания пишите на stalcom@ukr.net.
P. S. Я советую Вам скачать исходники отсюда.



Опубликовал admin
10 Дек, Среда 2003г.



Программирование для чайников.