Delphi Действия с посторонними окнами: Перемещение,
изменение размеров, скрытие...
Как "словить" окно? Под словом "словить" я имею ввиду то, как
обнаружить наличие окна (любого окна) среди других окон. Функция "ловли
окна" очень часто используется в том случае если вам необходимо совершить
над ним (окном) какое-нибудь действие: закрыть,
переместить, спрятать, изменить размеры и т.д. Еще раз скажу, что
все эти действия будут совершаться над "чужими" окноми, т.е. не над теми
которые ва разрабатываете, а над окнами других
приложений. Итак вы уже поняли ( я надеюсь ) для чего нужно
"словить" окно. Ниже представлен фрагмент кода, позволяющий определить
наличие окна в системе:
|
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_комманде и там вы увидете, какие должны быть параметры.
Винокуров
Даниил, 2000
Использование статьи возможно только с согласия
автора
|
|
|
|
|