Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
 
http://tui.ru/Tours/Europe/Austria/ новогодние туры 2016 в австрию.

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

   Существует большое количество статей на эту тему, но я все-таки хочу добавить к ним ещё одну. Эта статья будет посвящена функциям для работы с окнами (как Вы уже поняли из названия). Знатоки WinAPI, не судите меня за какие-либо ошибки или неточности, а лучше поправьте (e-mail: 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 параметров, которые мы будем узнавать об окне. Вот они:
  1. Заголовок
  2. Класс
  3. Дескриптор
  4. Дескриптор меню
  5. Иконка
  6. HInstance
  7. Заголовок родителя
  8. Дескриптор родителя
  9. Слева
  10. Сверху
  11. Высота
  12. Ширина
  13. Снизу
  14. Справа
  15. Дисплейный контекст
  16. Идентификатор процесса.

   Изменяемыми параметрами будут только все координаты, заголовок и иконка, напротив которых нужно поставить Edit'ы (кроме иконки естевственно), а остальные будут неизменяемыми, и напротив них можно поставить метки. Вот как начал я:

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

   Свойства 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. Я советую Вам скачать исходники отсюда

   Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи:  Алексей (StAL)
  

Другие статьи Наверх


  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо