« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
    Популярное
Скрытые возможности MS SQL: расширенная функциональность или уязвимость системы?

Функция LocalFlags

Включение фрагментов кода на JS в документ

Функция lstrcpy

Упаковка и проверка базы Access

Работа с Bluetooth в Delphi. Часть 3

Quake2.NET и Visual Studio 2008

Процесс загрузки

Реинжиниринг программного обеспечения

FAQ по работе с клавишами


    Архив файлов



    Сообщества



    Документация

Статьи:: Delphi :: Программирование на WinAPI :: Функции Windows API для работы с посторонними окнами


отправить ссылку другу версия для печати  Обсудить на форуме

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








XML документация в C#.

XML в .NET

Сегодня речь пойдет об одной интересной и полезной возможности языка С#, которая поможет нам в документировании кода. Она называется «XML документация» или «Документирующие комментарии XML». Это такие специальные теги XML, которые содержаться в комментариях и описывают свойства или методы в конкретном файле. Так вот, есть по крайней мере три веских причины, почему всегда следует заполнять XML комментарии.


Подробнее... | Рубрика: XML в .NET | Добавлено: 08.10.2008

Курсоры в MySQL 5.

MySQL

Начиная с 5-ой версии, MySQL имеет возможность создавать курсоры. Курсор — это виртуальная таблица, предоставляющая альтернативный способ просмотра табличных данных. Курсор не содержит данных, а лишь ссылается на них из других таблиц. Из этого вытекает ряд особенностей, но об этом ниже.


Подробнее... | Рубрика: MySQL | Добавлено: 08.10.2008

Microsoft опубликовала подробности о сессиях Windows 7.

Мероприятия

В преддверии конференции WinHEC компания Microsoft опубликовала подробный список сессий, которые пройдут в рамках конференции. Довольно-таки большое количество выступлений будет посвящено Windows 7, что не может не радовать. Принимая во внимание тот факт, что PDC и WinHEC разделяют несколько дней, а пройдут они в одном здании - Los Angeles Convention Center, - можно несколько дней поиграть в прятки, спрятавшись в какой-нибудь комнате, но зато бесплатно посетить WinHEC.


Подробнее... | Рубрика: Мероприятия | Добавлено: 08.10.2008

Остальные статьи:

Microsoft делится подробностями о том, что будет после Windows
Тестируем новый javascript от нового браузера Google
MySQL Query Cache
Использование провайдеров компиляции в Asp.net
Чего мы ждем от C# 4.0
Delphi 2009 и C++Builder 2009
Джоэл Спольски и Джеф Этвуд запустили новый вебсайт для программистов - StackOve...
Поиск кода Google /* что нового? */
10 jQuery скриптов для улучшения интерфейса
Генераторы отчетов FastReport 4 и QuickReport 5: версии 2008 года
День программиста — набор стерeотипов
Индусские програмисты
Вышел Django 1.0
Портативная версия Google Chrome Portable
Исходные коды .Net Frameword 3.5 SP1 для отладки в Visual Studio
Пишем правильный online WYSIWYG-редактор


Цитата дня (все,добавить):

Портал фрилансеров

    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 144
Пользователей: 0