Для начала определимся в некоторых необходимых функциях:
1)
Код:
function sendmessage( hwnd:hwnd; // описатель окна, которому мы отсылаем сообщение
msg:cardinal; // код сообщения, которое должно быть послано окну
wparam:wparam; // первый параметр сообщения
lparam:lparam // второй параметр сообщения
):lresult;
Функция отсылает окну с описателем hwnd сообщение, определённое uint. Результат функции зависит от сообщения и от того, что нам "ответят"
2)
Код:
function findwindow( lpclassname:pchar; // указатель на имя класса
lpwindowname:pchar // указатель на заголовок окна
):hwnd;
Функция ищет окно класса lpclassname(0- для любого класса) с заголовком lpwindowname(0- с любым заголовком) в верхнем уровне. В результате успешного поиска возвращается описатель найденного окна, в противном случае 0.
3)
Код:
function findwindowex( hwndparent:hwnd; // описатель родителя окна
hwndchildafter:hwnd; // описатель дочернего окна после которого по z-order идет поиск
lpszclass:pchar; // имя класса окна, которое мы хотим найти
lpszwindow:pchar // имя окна
):hwnd;
4) Код:
function getwindow( wnd: hwnd; // исходное окно
cmd: word // параметр для определения окна
):hwnd;
Функция считывает окно с отношением, указанным в cmd, в окно, указанное в wnd. Возвращает идентификатоp окна или 0, если окно не найдено или в cmd невеpное значение.
5) Код:
function getwindowtext( wnd: hwnd; // идентификатоp окна или оpгана упpавления
str: pchar; // буфеp, пpинимающий стpоку
maxcount: integer // размеp буфеpа str
): integer;
Функция копиpует в str заголовок окна или текст оpгана упpавления. В качестве результата возвращается фактическое число скопиpованных байт или 0, если текст отсутствует.
Примеры работы с окнами по winapi
Пример 1
В данном примере мы находим все окна, открытые в системе
Код:
procedure getwindows(list:tstrings);
var hnd:thandle;
b:array[0..255]of char;
s:string;
begin
hnd:=0;
repeat
zeromemory(@b,sizeof(b)); // чистим буфер
getwindowtext(hnd,@b,255); // получаем текст окна
s:=strpas(@b);
if s='' then s:='notext';
zeromemory(@b,sizeof(b));
getclassname(hnd,@b,255); // получаем имя класса окна
s:=s+' - ['+strpas(@b)+']';
list.add(s); // добавляем в список
hnd:=findwindowex(0,hnd,0,0); // определяем следующее окно
until hnd=0;
end;
procedure tform1.button1click(sender: tobject);
begin
getwindows(listbox1.items); // заполняем список
end;
Пример 2
Не знаю почему, но обычно для примеров по winapi используют кнопку "Пуск". Не будем выделяться
Программа прячет кнопку на 5 сек, затем снова показывает и через секунду пишет на ней "Нажми меня".
Код:
procedure tform1.button1click(sender: 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); // прячем кнопку
sendmessage(hnd,wm_paint,0,0); // вызываем перерисовку, так, на всякий случай
sleep(5000); // отдыхаем 5 сек.
showwindow(hnd,sw_show); // снова показываем кнопку
sendmessage(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;