Работа с окнами

Содержание

Слайд 2

BringWindowToTop - Выводит окно поверх других по Z-порядку CloseWindow - Минимизирует

BringWindowToTop - Выводит окно поверх других по Z-порядку CloseWindow - Минимизирует (не

закрывает) окно EnableWindow - Делает окно доступным/недоступным EnumChildWindows - Просматривает все дочерние окна EnumWindows - Просматривает все главные окна FindWindow - Ищет окно в системе FindWindowEx - Ищет дочернее окно GetClassName - Узнает имя класса заданного окна GetClassLong - Узнает информацию о данном классе GetClientRect - Достает Rect клиентской области окна GetDesktopWindow - Возвращает дескриптор Desktop GetForegroundWindow - Ищет верхнее окно системы GetNextWindow - Находит следующее или предыдущее окно GetWindow - Возвращает дескриптор окна, с заданным положением GetDC - Ищет дисплейный контекст окна
Слайд 3

GetWindowLong - Узнает информацию о заданном окне GetWindowRect - Достает Rect

GetWindowLong - Узнает информацию о заданном окне GetWindowRect - Достает Rect всего

окна GetWindowText - Возвращает текст окна GetWindowTextLength - Возвращает длину текста окна GetWindowThreadProcessId - Узнает процесс, которому принадлежит заданное окно IsChild - Дочернее ли окно IsIconic - Свернуто ли окно IsWindow - Есть ли такое окно в системе IsWindowVisible - Видимое ли это окно IsZoomed - Максимизировано ли это окно MoveWindow - Перемещает окно OpenIcon - Восстанавливает окно из иконки SetForegroundWindow - Назначает верхнее окно системы SetWindowLong - Устанавливает новые параметры окна SetWindowPos - Устанавливает позицию окна SetWindowText - Изменяет заголовок окна ShowWindow - Показывает окно с заданными параметрами WindowFromPoint - Возвращает окно из заданной позиции
Слайд 4

Ниже представлен фрагмент кода, позволяющий определить наличие окна в системе: if

Ниже представлен фрагмент кода, позволяющий определить наличие окна в системе:
if findwindow(nil,

'1.txt - Блокнот') <>0 then showmessage ('Окно присутствует');

SetWindowPos(findwindow(nil,'1.txt - Блокнот'),HWND_BOTTOM,1,1,20,20,SWP_nosize);

Слайд 5

Первый параметр - заголовок окна, с которым надо что-либо сделать (

Первый параметр - заголовок окна, с которым надо что-либо сделать (

в данном случае - передвинуть). Заголовок передается функцией "ловли" окна findwindow(nil,'1.txt - Блокнот') , где 1.txt - Блокнот заголовок окна
Второй параметр - положение окно ( т.е. его Z-расположение ) он нам сейчас не нужен. Просто считайте, что он должен быть HWND_BOTTOM
Третий параметр - координыты окна по "Оси X" в пикселах.
Четвертый параметр - координыты окна по "Оси Y" в пикселах (т.е. этими координмтами вы указываете куда двигать окно).
Пятый - размер окна по горизонтали
Шестой - размер окна по вертикали
Седьмой параметр, он имеет несколько значений. Вот основные из них:
Слайд 6

∙ HWND_BOTTOM - Размещает окно внизу Z - последовательности. Если параметр

∙ HWND_BOTTOM - Размещает окно внизу Z - последовательности. Если параметр hWnd

идентифицирует самое верхнее окно, окно теряет свое самое верхнее состояние и помещается внизу всех других окон.
∙ HWND_NOTOPMOST - Помещает окно выше всех не самых верхних окон (то есть позади всех самых верхних окон). Этот флажок не имеет никакого эффекта, если окно - уже не самое верхнее окно.
∙ HWND_TOP - Помещает окно наверху Z - последовательности.
∙ HWND_TOPMOST - Помещает окно выше всех не самых верхних окон. Окно поддерживает самую верхнюю позицию даже, когда оно дезактивировано.
Слайд 7

SWP_HIDEWINDOW - после проделаных действий над окном ( перемещением и изменением

SWP_HIDEWINDOW - после проделаных действий над окном ( перемещением и изменением

размера ) окно прячется
SWP_NOSIZE - если указан этот параметр, то 5й и 6й параметры учитываться не будут, т.е. окно менять размер не будет (этот параметр указан в нашем примере )
SWP_NOMOVE - если указан этот параметр, то 3й и 4й параметры учитываться не будут, т.е. окно не будет перемещаться.
SWP_SHOWWINDOW - после проделанных действий над окном ( перемещением и изменением размера ) окно будет показано ( работает только если окно было спрятано)
Слайд 8

setwindowtext (findwindow(nil,'1.txt - Блокнот'),'Окно Хакера') Showwindow(findwindow(nil,'1.txt - Блокнот'),sw_hide); SW_HIDE -Прятать окно

setwindowtext (findwindow(nil,'1.txt - Блокнот'),'Окно Хакера')

Showwindow(findwindow(nil,'1.txt - Блокнот'),sw_hide);

SW_HIDE -Прятать окно
SW_MAXIMIZE -Максимизировать

окно
SW_MINIMIZE -Минимизировать окно
SW_SHOW -показать окно (Его надо вызывать если вы хотите показать уже спрятанное окно)
Слайд 9

postmessage( findwindow(nil,'заголовок окна'), wm_команда, парам3, парам4); В первом параметре - findwindow(nil,'заголовок

postmessage( findwindow(nil,'заголовок окна'), wm_команда,
парам3, парам4);
В первом параметре - findwindow(nil,'заголовок окна')


передается заголовок окна.
Второй пареметр - комманда, указывающая какое действие
должно совершиться над окном.
Все эти комманды начинаются на WM_
(wm_size, wm_quit, и т.д.)
Третий и четвертый параметры(парам3 и парам4) - это
параметры wm_комманды.

postmessage(findwindow(nil,'1.txt - Блокнот'), wm_quit,0,0);

Слайд 10

Функция GetNextWindow Синтаксис: function GetNextWindow(Wnd: HWnd; Flag: Word): Hwnd; Описание: Считывает

Функция GetNextWindow Синтаксис: function GetNextWindow(Wnd: HWnd; Flag: Word): Hwnd; Описание: Считывает

из Wnd следующее или предыдущее окно. В случае окна верхнего уровня ищется следующее окно верхнего уровня, а в случае дочернего окна ищется следующее дочернее окно. параметры:
∙ Wnd: идентификатор окна.
∙ Flag: Одна из констант gw_HWndNext - искать следующее окно gw_HwndPrev - искать предыдущее окно.
возвращаемое значение: Идентификатор окна.
Функция GetNextWindow находит все окна текущего уровня (если задано окно верхнего уровня, - то ищет окно верхнего уровня, если дочернее окно - то список дочерних)
Осталось определить, как найти исходный описатель окна, от которого будем плясать (параметр WND функции)
Можно попробовать начать поиски с верхнего окна системы. Его можно определить при помощи следующей функции API:
Слайд 11

Функция: GetForegroundWindow Синтаксис: function GetForeGroundWindow: Hwnd; Описание: Показывает верхнее окно системы.

Функция: GetForegroundWindow Синтаксис: function GetForeGroundWindow: Hwnd; Описание: Показывает верхнее окно системы.

Параметры: нет. Возвращаемое значение: Идентификатор окна.

Функция EnumWindows Синтаксис: function EnumWindows(EnumFunc: TFarProc, lParam: Longint): Bool; Описание: Пеpечисляет все pодительские окна на экpане, пеpедавая функции обpатного вызова ( т.е объявленная как stdcall функция) описатель окна и lParam. Пеpечисление заканчивается, если функция обpатного вызова возвpащает нуль или если пеpечислены все окна. Параметры:
∙ EnumFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова.
∙ lParam: Значение, пеpеданное функции обpатного вызова.
Возвращаемое значение: Не нуль, если пеpечислены все окна; 0 - в пpотивном случае.

Слайд 12

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall

!!!
Begin
ListBox1.Items.Add(IntToStr(Wd)); // Добавляем текущий описатель окна
EnumProc := TRUE;
end;
Procedure TForm1.GetAllWindow;
Begin ListBox1.Items.Clear; // Очистим список перед началом поисков
EnumWindows (@EnumProc, 0); // и скажем - искать
End;
Слайд 13

Функция GetClassName Синтаксис: function GetClassName(Wnd: HWnd; ClassName: PChar; MaxCount: Integer): Integer;

Функция GetClassName Синтаксис: function GetClassName(Wnd: HWnd; ClassName: PChar; MaxCount: Integer): Integer;

Описание: Считывает имя класса окна. Параметры:
∙ Wnd: Идентификатор окна.
∙ ClassName: Буфеp для пpиема имени класса.
∙ MaxCount: Размеp буфеpа
Возвращаемое значение: Фактическое число скопиpованных символов; 0 - если ошибка.
Слайд 14

Функция GetWindowText Синтаксис: function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): Integer;

Функция GetWindowText Синтаксис: function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): Integer;

Описание: Копиpует в Str заголовок окна или текст оpгана упpавления. Параметры:
∙ Wnd: Идентификатор окна или оpгана упpавления.
∙ Str: Буфеp, пpинимающий стpоку.
∙ MaxCount: Размеp буфеpа Str.
Возвращаемое значение: Фактическое число скопиpованных байт или 0, если текст отсутствует.
Слайд 15

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Var Nm:Array[0..255]

function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; //
Var

Nm:Array[0..255] of Char; // буфер для имени
Cs: Array[0..255] of Char; // буфер для класса
Begin GetWindowText(Wd,Nm,255); // считываем текст заголовка
окна
GetClassName(Wd,Cs,255); // считываем название класса окна ListBox1.Items.Add(String(Nm)+'/'+String(Cs)); // Добавляем
название окна и класс в список
EnumProc := TRUE; // продолжать искать окна…
end;

ProgMan не что иное как рабочий стол

Чтобы исключить свою программу из списка достаточно просто поставить проверку В тексте 3: If Wd<>Form1.Handle then ListBox1.Items.Add(String(Nm)+'/'+String(Cs));

Слайд 16

Функция IsIconic Синтаксис: function IsIconic(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

Функция IsIconic Синтаксис: function IsIconic(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

окно пиктогpаммой (минимизиpованным). Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Не ноль, если минимизиpовано; 0 - если нет.
Функция IsWindow Синтаксис: function IsWindow(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли окно допустимым существующим окном. Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Не нуль, если окно достовеpно; 0 - если нет.
Слайд 17

Функция IsWindowEnabled Синтаксис: function IsWindowEnabled(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

Функция IsWindowEnabled Синтаксис: function IsWindowEnabled(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

окно pазpешенным для ввода с мыши и с клавиатуpы. Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Не нуль, если окно pазpешено; 0 - если нет.

Функция IsWindowVisible Синтаксис: function IsWindowVisible(Wnd: HWnd): Bool; Описание: Опpеделяет, сделано ли окно видимым функцией ShowWindow. Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Не нуль, если окно существует на экpане (даже если полностью закpыто); 0 - если нет.

Слайд 18

Функция IsZoomed Синтаксис: function IsZoomed(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

Функция IsZoomed Синтаксис: function IsZoomed(Wnd: HWnd): Bool; Описание: Опpеделяет, является ли

окно максимизиpованным. Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Не нуль, если окно максимизиpовано; 0 - если нет.

Получение данных о расположении окна:
Процедура GetWindowRect Синтаксис: procedure GetWindowRect(Wnd: HWnd; var Rect); Описание: Считывает в ARect pазмеpности огpаничивающего пpямоугольника окна (в кооpдинатах экpана). Параметры:
∙ Wnd: Идентификатор окна.
∙ Rect: Пpинимающая стpуктуpа TRect.
Возвращаемое значение: Не используется

Слайд 19

Функция GetWindowDC Синтаксис: function GetWindowDC(Wnd: HWnd): HDC; Описание: Считывает контекст дисплея,

Функция GetWindowDC Синтаксис: function GetWindowDC(Wnd: HWnd): HDC; Описание: Считывает контекст дисплея,

обычно используемый для pаскpаски в окне областей, не являющихся областями пользователя. Параметры: Wnd: Идентификатор окна. Возвращаемое значение: Идентификатор контекста дисплея; 0 - если ошибка.
Слайд 20

Скопировать все окно в BMP Function WindowToBMP(WD: HWND ): TBitmap; Var

Скопировать все окно в BMP
Function WindowToBMP(WD: HWND ): TBitmap;
Var
WinDC: HDC;
ARect

: TRect;
begin
Result := TBitmap.Create;
// Создаем рисунок, куда будем копировать
GetWindowRect(WD, ARect);
// Узнаем размер
with Result, ARect do
begin
Width := ARect.Right - ARect.Left;
Height := ARect.Bottom - ARect.Top;
If (Width=0) or (Height=0) then
Слайд 21

Begin MessageDlg('Размер области формы равен нулю', mtWarning,[mbOk],0); // А вдруг у

Begin
MessageDlg('Размер области формы равен нулю',
mtWarning,[mbOk],0);
// А вдруг у него нет

размера ???
Exit; // Тогда выходим
End;

WinDC:=GetWindowDC(Wd); // получаем для окна контекст устройства ShowWindow(Wd, SW_SHOW); // на всякий случай выведем окно
BringWindowToTop(WD); // и поместим поверх окон
try

// копируем оттуда прямоугольную область на канву растрового изображения
BitBlt( Canvas.Handle, 0, 0, Width, Height, WinDC, 0, 0, SRCCOPY); finally
end; end; end;

Слайд 22

для того, чтобы скопировать весь экран или часть экрана можно использовать

для того, чтобы скопировать весь экран или часть экрана можно использовать

подобные функции. Единственное, что в таком случае придется поменять так это контекст устройства.
Контекст устройства всего экрана 0. Ну и вместо того,
чтобы получать область окна, нужно будет явно передавать координаты области, которую необходимо скопировать.
Слайд 23

Функция GetWindowLong Синтаксис: function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; Описание: Считывает

Функция GetWindowLong Синтаксис: function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; Описание: Считывает

инфоpмацию об окне или о значениях дополнительного байта окна. Паpаметpы:
∙ Wnd: Идентификатоp окна.
∙ Index: Смещение в байтах или одна из следующих констант: GWL_EXSTYLE возвращает расширенный стиль окна. GWL_STYLE возвращает стиль окна. GWL_WNDPROC возвращает адрес стандартной процедуры окна. GWL_HINSTANCE возвращает экземпляр приложения окна. GWL_HWNDPARENT возвращает описатель родительского окна. GWL_ID возвращает идентификатор окна. GWL_USERDATA возвращает пользовательские данные об окне.
Слайд 24

Function WinIconToBMP(Wd:HWND); Var Icon:HICON; // Тип указатель на иконку Begin Result:=TbitMap.Create;

Function WinIconToBMP(Wd:HWND);
Var Icon:HICON; // Тип указатель на иконку
Begin
Result:=TbitMap.Create;

Icon:=GetClassLong(Wd,GCL_HICON); // Получаем иконку по описателю
If ICON > 0 then // Если получена действительно иконка
With Result do
Begin
Height:=31;
Width:=31;
Canvas.Brush.Color:=clWhite;
Canvas.FillRect(Rect(0,0,31,31)); // На всякий случай заливаем белым
DrawIcon(Canvas.Handle, 0, 0, Icon); // И отрисовываем ее на канве
End;
End;
Слайд 25

Функция GetWindowThreadProcessId Синтаксис: DWORD GetWindowThreadProcessId(Wnd: HWND; lpdwProcessId : LPDWORD); Описание: Возвращает

Функция GetWindowThreadProcessId Синтаксис: DWORD GetWindowThreadProcessId(Wnd: HWND; lpdwProcessId : LPDWORD); Описание: Возвращает

идентификатор процесса к которому принадлежит данное окно Параметры: Wnd: Идентификатор окна. lpdwProcessId : 32битное значение идентификатора процесса Возвращаемое значение: идентификатор нити
Как использовать данную функцию ??
Var
mProcessID,mThreadID : Dword;
Begin
// Получение описателя в WD
mThreadID:= GetWindowThreadProcessId(Wd,@mProcessID);
// Получения идентификаторов.
End;
Слайд 26

Программа прячет кнопку на 5 сек, затем снова показывает и через

Программа прячет кнопку на 5 сек, затем снова показывает и через

секунду пишет на ней "Нажми меня".

procedure t form1.button1click(s ender: tobject); var hnd:thandle;  canvas:tcanvas;  dc:hdc; begin  hnd:=findwindow('shell_traywnd',0);// находим описатель tray  hnd:=findwindowex(hnd,0,'button',0);// находим кнопку пуск  showwindow(hnd,sw_hide); // прячем кнопку  s endmessage(hnd,wm_paint,0,0); // вызываем перерисовку, так, на всякий случай :)  sleep(5000); // отдыхаем 5 сек

Слайд 27

showwindow(hnd,sw_show); // снова показываем кнопку s endmessage(hnd,wm_paint,0,0); // перерисовываем кнопку sleep(1000);

showwindow(hnd,sw_show); // снова показываем кнопку  s endmessage(hnd,wm_paint,0,0); // перерисовываем кнопку  sleep(1000);

// приостановка на 1 сек  canvas:=tcanvas.create; // создаем канву  dc:=getdc(hnd); // получаем дескриптор кнопки  with canvas do begin  handle:=dc; // теперь с поверхностью кнопки можно работать, как с простой канвой  rectangle(0,0,100,100); // рисуем прямоугольник на кнопке  font.color:=$0000ff; // ставим красный цвет шрифта  textout(10,0,'Нажми');  textout(13,10,'меня'); //выводим текст  free; // освобождаем память end;  releasedc(0,dc); end;