Слайд 1Для работы с окнами Windows предоставляет большое количество функций, которые
описаны в модуле Windows.pas, и экспортируются из Windows'овских библиотек (DLL
- Dynamic Link Library).
функции API
Слайд 2BringWindowToTop - Выводит окно поверх других по Z-порядку
CloseWindow - Минимизирует
(не закрывает) окно
EnableWindow - Делает окно доступным/недоступным
EnumChildWindows - Просматривает все
дочерние окна
EnumWindows - Просматривает все главные окна
FindWindow - Ищет окно в системе
FindWindowEx - Ищет дочернее окно
GetClassName - Узнает имя класса заданного окна
GetClassLong - Узнает информацию о данном классе
GetClientRect - Достает Rect клиентской области окна
GetDesktopWindow - Возвращает дескриптор Desktop
GetForegroundWindow - Ищет верхнее окно системы
GetNextWindow - Находит следующее или предыдущее окно
GetWindow - Возвращает дескриптор окна, с заданным положением
GetDC - Ищет дисплейный контекст окна
Слайд 3GetWindowLong - Узнает информацию о заданном окне
GetWindowRect - Достает Rect
всего окна
GetWindowText - Возвращает текст окна
GetWindowTextLength - Возвращает длину текста
окна
GetWindowThreadProcessId - Узнает процесс, которому принадлежит заданное окно
IsChild - Дочернее ли окно
IsIconic - Свернуто ли окно
IsWindow - Есть ли такое окно в системе
IsWindowVisible - Видимое ли это окно
IsZoomed - Максимизировано ли это окно
MoveWindow - Перемещает окно
OpenIcon - Восстанавливает окно из иконки
SetForegroundWindow - Назначает верхнее окно системы
SetWindowLong - Устанавливает новые параметры окна
SetWindowPos - Устанавливает позицию окна
SetWindowText - Изменяет заголовок окна
ShowWindow - Показывает окно с заданными параметрами
WindowFromPoint - Возвращает окно из заданной позиции
Слайд 4Ниже представлен фрагмент кода, позволяющий определить наличие окна в системе:
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 идентифицирует самое верхнее окно, окно теряет свое самое верхнее
состояние и помещается внизу всех других окон.
∙ HWND_NOTOPMOST - Помещает окно выше всех не самых верхних окон (то есть позади всех самых верхних окон). Этот флажок не имеет никакого эффекта, если окно - уже не самое верхнее окно.
∙ HWND_TOP - Помещает окно наверху Z - последовательности.
∙ HWND_TOPMOST - Помещает окно выше всех не самых верхних окон. Окно поддерживает самую верхнюю позицию даже, когда оно дезактивировано.
Слайд 7SWP_HIDEWINDOW - после проделаных действий над окном ( перемещением и
изменением размера ) окно прячется
SWP_NOSIZE - если указан этот
параметр, то 5й и 6й параметры учитываться не будут, т.е. окно менять размер не будет (этот параметр указан в нашем примере )
SWP_NOMOVE - если указан этот параметр, то 3й и 4й параметры учитываться не будут, т.е. окно не будет перемещаться.
SWP_SHOWWINDOW - после проделанных действий над окном ( перемещением и изменением размера ) окно будет показано ( работает только если окно было спрятано)
Слайд 8setwindowtext (findwindow(nil,'1.txt - Блокнот'),'Окно Хакера')
Showwindow(findwindow(nil,'1.txt - Блокнот'),sw_hide);
SW_HIDE -Прятать окно
SW_MAXIMIZE
-Максимизировать окно
SW_MINIMIZE -Минимизировать окно
SW_SHOW -показать окно (Его надо вызывать если
вы хотите показать уже спрятанное окно)
Слайд 9postmessage( 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;
Описание:
Считывает из Wnd следующее или предыдущее окно. В случае окна
верхнего уровня ищется следующее окно верхнего уровня, а в случае дочернего окна ищется следующее дочернее окно.
параметры:
∙ Wnd: идентификатор окна.
∙ Flag: Одна из констант
gw_HWndNext - искать следующее окно
gw_HwndPrev - искать предыдущее окно.
возвращаемое значение: Идентификатор окна.
Функция GetNextWindow находит все окна текущего уровня (если задано окно верхнего уровня, - то ищет окно верхнего уровня, если дочернее окно - то список дочерних)
Осталось определить, как найти исходный описатель окна, от которого будем плясать (параметр WND функции)
Можно попробовать начать поиски с верхнего окна системы. Его можно определить при помощи следующей функции API:
Слайд 11Функция: 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отивном случае.
Слайд 12function 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;
Описание: Считывает имя класса окна.
Параметры:
∙ Wnd: Идентификатор окна.
∙ ClassName: Буфеp для пpиема имени класса.
∙ MaxCount: Размеp буфеpа
Возвращаемое значение: Фактическое число скопиpованных символов; 0 - если ошибка.
Слайд 14Функция 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, если текст отсутствует.
Слайд 15function 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еделяет, является
ли окно пиктогpаммой (минимизиpованным).
Параметры:
Wnd: Идентификатор окна.
Возвращаемое значение:
Не ноль, если минимизиpовано; 0 - если нет.
Функция IsWindow
Синтаксис: function IsWindow(Wnd: HWnd): Bool;
Описание: Опpеделяет, является ли окно допустимым существующим окном.
Параметры:
Wnd: Идентификатор окна.
Возвращаемое значение: Не нуль, если окно достовеpно; 0 - если нет.
Слайд 17Функция 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еделяет, является
ли окно максимизи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;
Описание: Считывает контекст
дисплея, обычно используемый для pаскpаски в окне областей, не являющихся
областями пользователя.
Параметры:
Wnd: Идентификатор окна.
Возвращаемое значение: Идентификатор контекста дисплея; 0 - если ошибка.
Слайд 20Скопировать все окно в 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
Слайд 21Begin
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;
Описание:
Считывает инфоpмацию об окне или о значениях дополнительного байта окна.
Паpаметpы:
∙ Wnd: Идентификатоp окна.
∙ Index: Смещение в байтах или одна из следующих констант:
GWL_EXSTYLE возвращает расширенный стиль окна.
GWL_STYLE возвращает стиль окна.
GWL_WNDPROC возвращает адрес стандартной процедуры окна.
GWL_HINSTANCE возвращает экземпляр приложения окна.
GWL_HWNDPARENT возвращает описатель родительского окна.
GWL_ID возвращает идентификатор окна.
GWL_USERDATA возвращает пользовательские данные об окне.
Слайд 24Function 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);
Описание:
Возвращает идентификатор процесса к которому принадлежит данное окно
Параметры: Wnd:
Идентификатор окна.
lpdwProcessId : 32битное значение идентификатора процесса
Возвращаемое значение: идентификатор нити
Как использовать данную функцию ??
Var
mProcessID,mThreadID : Dword;
Begin
// Получение описателя в WD
mThreadID:= GetWindowThreadProcessId(Wd,@mProcessID);
// Получения идентификаторов.
End;
Слайд 26Программа прячет кнопку на 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 сек
Слайд 27showwindow(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;
Слайд 28Задание на самостоятельую работу
Переименовать окно, если окно свернуто –развернуть его
если развернуто свернуть.
Вывести все существующие в системе окна и максимально
возможное количество их характеристик
Нанести графическое или текстовое изображение на любое окно в системе.