Как "словить" окно? Под словом "словить" я имею ввиду то, как обнаружить
наличие окна (любого окна) среди других окон. Функция "ловли окна" очень часто
используется в том случае если вам необходимо совершить над ним (окном)
какое-нибудь действие: закрыть, переместить, спрятать,
изменить размеры и т.д. Еще раз скажу, что все эти действия будут
совершаться над "чужими" окноми, т.е. не над теми которые ва разрабатываете, а над окнами других приложений. Итак вы уже поняли (
я надеюсь ) для чего нужно "словить" окно. Ниже представлен фрагмент кода,
позволяющий определить наличие окна в системе:
if findwindow(nil, '1.txt - Блокнот') <>0 then showmessage ('Окно присутствует');
Если вы поместите эту строчку в процедуру обработки события нажатия на кнопку
(или в другое место ),запустите программу и нажмете на кнопку, ваша программа
выдаст сообщение "Окно присутствует" если вы перед этим запустили блокнот
и сохранили документ под названием 1.txt Иными словами программа смотрит есть ли
окно с таким заголовком какой вы указали (он выделен вот
таким цветом) и если оно есть - выдает сообщение, в противном же случае
ничего не произойдет.
Теперь когда, вы знаете как использовать функцию ловли окна, попробуем
передвинуть его:
//Поместите этот код в процедуру обработки события нажатия на кнопку
if findwindow(nil, '1.txt - Блокнот') <>0 then
SetWindowPos(findwindow(nil,'1.txt - Блокнот'),HWND_BOTTOM,1,1,20,20,SWP_nosize);
//--------------------------------------------------------------------------------
Запустите Блокноти сохраните пустой(или не пустой) документ под именем 1.txt
(Обратите внимание, что заголовок окна будет 1.txt -
Блокнот) Теперь запустите программу и нажмите на кнопку. Если все сделано
правильно, то окно блокнота передвинится в левый верхний угол экрана. Теперь
давайте разберем, как вы это сделали.
Первая строчка - функция "ловли" окна. Она проверяет есть ли окно с таким
заголовком. Если есть, то выполняется следующая (вторая) строчка:
SetWindowPos(findwindow(nil,'1.txt - Блокнот'),HWND_BOTTOM,1,1,20,20,SWP_nosize);
Где :
первый параметр - заголовок окна, с которым надо что-либо сделать ( в данном
случае - передвинуть). Заголовок передается функцией "ловли" окна
findwindow(nil,'1.txt - Блокнот')
где 1.txt - Блокнот заголовок окна
Второй параметр - положение окно ( т.е. его Z-расположение ) он нам сейчас не
нужен. Просто считайте, что он должен быть HWND_BOTTOM
Третий параметр - координыты окна по "Оси X" в пикселах.
Четвертый параметр - координыты окна по "Оси Y" в пикселах
(т.е. этими координмтами вы указываете куда двигать окно).
Пятый - размер окна по горизонтали
Шестой - размер окна по вертикали
И, наконец, седьмой параметр, он имеет несколько значений. Вот основные из
них:
SWP_HIDEWINDOW - после
проделаных действий над окном (
перемещением и изменением
размера ) окно прячется
SWP_NOSIZE - если указан этот
параметр, то 5й и 6й параметры
учитываться не будут, т.е. окно
менять размер не будет (этот
параметр указан в нашем примере
)
SWP_NOMOVE - если указан этот
параметр, то 3й и 4й параметры
учитываться не будут, т.е. окно
не будет перемещаться.
SWP_SHOWWINDOW - после
проделаных действий над окном (
перемещением и изменением
размера ) окно будет показано (
работает только если окно было
спрятано)
Теперь можно и
текст изменить... Вот, например,
есть у вас какое-нибудь окно,
допустим заголовок у него все
тот же - 1.txt - Блокнот. Как же
из своей программы поменять
заголовок у этого окна? А очень
просто:
//Поместите этот код в процедуру обработки события нажатия на кнопку
setwindowtext (findwindow(nil,'1.txt - Блокнот'),'Окно By Vasya Pupkin')
//---------------------------------------------------------------------------------
Запустите
программу, нажмите на кнопку
и...о чудо - окно названо вашим
именем :-)
Функция
setwindowtext имеет 2
параметра :
Первый -
заголовок окна, у которого будем
менять заголовок. (Простите за
каламбур). Он определяется через
функцию "ловли" окна:
findwindow(nil,'1.txt - Блокнот')
где 1.txt -
Блокнот и есть тот самый
(начальный) заголовок окна
Второй - новый
заголовок (типа String)
Есть еще одна
интересная функция, которая
может вам пригодиться. Это -
Showwindow.
Используя ее вы сможете прятать
( и, естественно, показавать
обратно) окна. Использование
этой функции еще легче, чем
использование предыдущих:
Showwindow(findwindow(nil,'1.txt - Блокнот'),sw_hide);
После выполнения
программы окно "1.txt - Блокнот"
будет спрятано (но не закрыто!).
У этой функции тоже 2 параметра:
Первый -
заголовок окна. Он определяется
через функцию "ловли" окна:
findwindow(nil,'1.txt - Блокнот')
где 1.txt -
Блокнот заголовок окна
Второй -
указания, что делать:
SW_HIDE -Прятать окно
SW_MAXIMIZE -Максимизировать окно
SW_MINIMIZE -Минимизировать окно
SW_SHOW -показать окно (Его надо вызывать если вы хотите показать уже спрятанное окно)
Еще один способ передачи комманд окнам - это использование функции
Postmessage. Например, чтобы закрыть окно с заголовком "1.txt - Блокнот" вставьте этот код в процедуру обработки события нажатия на кнопку:
postmessage(findwindow(nil,'1.txt - Блокнот'), wm_quit,0,0);
Если у вас было запущено окно с заголовком 1.txt - Блокнот, то оно закроется.
Postmessage имеет несколько параметров, и в различных случаях они разные. Вот некий шаблон использования Postmessage:
postmessage( findwindow(nil,'заголовок окна'), wm_команда, парам3, парам4);
В первом параметре -
findwindow(nil,'заголовок окна')
вы
передаете заголовок окна.
Второй пареметр - комманда, указывающая какое действие должно совершиться над окном ( в данном примере эта комманда - WM_QUIT, она закрывает окно). Все эти комманды начинаются на
WM_ (wm_size, wm_quit, и т.д.)
Третий и четвертый параметры(парам3 и парам4) - это параметры wm_комманды. Чтобы получить сведения о этих параметрах( да и о самих wm_коммандах) откройте справку Delphi (ПУСК=>Программы=> Borland Delphi => HELP=> MS SDK Help Files=> Win32 Programmer's Reference) откройте вкладку "Указатель" и наберите WM_ и вы увидете целый список этих комманд. Если вы хотите узнать параметры для данной wm_комманды, откройте справку по этой wm_комманде и там вы увидете, какие должны быть параметры.
|