- •Для работы с окнами Windows предоставляет большое количество функций, которые описаны в модуле
- •BringWindowToTop - Выводит окно поверх других по Z- порядку
- •GetWindowLong - Узнает информацию о заданном окне GetWindowRect - Достает Rect всего окна
- •Ниже представлен фрагмент кода, позволяющий определить наличие окна в системе:
- •Первый параметр - заголовок окна, с которым надо что-либо сделать ( в данном
- •HWND_BOTTOM - Размещает окно внизу Z - последовательности. Если параметр hWnd идентифицирует самое
- •SWP_HIDEWINDOW - после проделаных действий над окном ( перемещением и изменением размера )
- •setwindowtext (findwindow(nil,'1.txt - Блокнот'),'Окно Хакера')
- •postmessage( findwindow(nil,'заголовок окна'), wm_команда,
- •Функция GetNextWindow
- •Функция: GetForegroundWindow
- •function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
- •Функция GetClassName
- •Функция GetWindowText
- •function EnumProc (Wd: HWnd; Param: LongInt): Boolean; stdcall; // Var Nm:Array[0..255] of Char;
- •Функция IsIconic
- •Функция IsWindowEnabled
- •Функция IsZoomed
- •Функция GetWindowDC
- •Скопировать все окно в BMP
- •Begin
- •для того, чтобы скопировать весь экран или часть экрана можно использовать подобные функции.
- •Функция GetWindowLong
- •Function WinIconToBMP(Wd:HWND);
- •Функция GetWindowThreadProcessId
- •Программа прячет кнопку на 5 сек, затем снова показывает и через секунду пишет
- •showwindow(hnd,sw_show); // снова показываем кнопку
- •Задание на самостоятельую работу
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;
для того, чтобы скопировать весь экран или часть экрана можно использовать подобные функции. Единственное, что в таком случае придется поменять так это контекст устройства. Контекст устройства всего экрана 0. Ну и вместо того, чтобы получать область окна, нужно будет явно передавать координаты области, которую необходимо скопировать.
Функция 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 возвращает пользовательские данные об окне.
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;
Функция GetWindowThreadProcessId
Синтаксис: DWORD GetWindowThreadProcessId(Wnd: HWND;
lpdwProcessId : LPDWORD);
Описание: Возвращает идентификатор процесса к которому
принадлежит данное окно
Параметры: Wnd: Идентификатор окна.
lpdwProcessId : 32битное значение идентификатора процесса
Возвращаемое значение: идентификатор нити
Как использовать данную функцию ??
Var
mProcessID,mThreadID : Dword; Begin
// Получение описателя в WD
mThreadID:=
GetWindowThreadProcessId(Wd,@mProcessID);
//Получения идентификаторов. End;
Программа прячет кнопку на 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 сек
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;
Задание на самостоятельую работу
1.Переименовать окно, если окно свернуто – развернуть его если развернуто свернуть.
2.Вывести все существующие в системе окна и максимально возможное количество их характеристик
3.Нанести графическое или текстовое изображение на любое окно в системе.