Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Действия с посторонними окнами

Винокуров Даниил (C) 2000

Как "словить" окно? Под словом "словить" я имею ввиду то, как обнаружить наличие окна (любого окна) среди других окон. Функция "ловли окна" очень часто используется в том случае если вам необходимо совершить над ним (окном) какое-нибудь действие: закрыть, переместить, спрятать, изменить размеры и т.д. Еще раз скажу, что все эти действия будут совершаться над "чужими" окноми, т.е. не над теми которые ва разрабатываете, а над окнами других приложений. Итак вы уже поняли ( я надеюсь ) для чего нужно "словить" окно. Ниже представлен фрагмент кода, позволяющий определить наличие окна в системе:

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_комманде и там вы увидете, какие должны быть параметры.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
14 мая 2006, 12:28:32
"В первом параметре - findwindow(nil,'заголовок окна') вы передаете заголовок окна." - да я почитал, понял что автор сам юзер и ничего не понимает в WinAPI и Windows. Какой нафиг заголовок окна передает - только хендл!
2.
Аноним
Мне нравитсяМне не нравится
31 августа 2005, 18:01:22
вобще то юзается handler. обычно типа hwnd:dword;
так удобнее если надо бработать сразу несклько комманд с обним окном.
и всё же нажатия кнопок посылать прикольнее. я так раньше проги "ломал". ога.
3.
Аноним
Мне нравитсяМне не нравится
26 марта 2005, 07:42:51
Согласен. По-моему больше толку если не слишком подробно - быстрее учишся...
4.
Аноним
Мне нравитсяМне не нравится
7 июля 2004, 15:13:47
Ну это уж совсем для юзеров
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог