Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Управлять другим приложением!


grigory ©   (2005-01-12 16:16:00) 

Здравсвуйте! Подскажите..можно ли, и как, из одного приложения работать с другим? то есть например нажимать кнопки..или выбирать пункт меню! Наверно нужно SendMessage послать окну сообщение?если можно пример.. Спасибо!


Sumor   (2005-01-18 19:06:00) [1]

Точно такая и есть


grigory   (2005-01-18 12:07:00) [2]


> Sumor

спасибо большое! вот теперь понял хоть что делать..буду разбираться как:)) тока хочу уточнить последний момент.. Для диалоговых окон процедура тажа?


Sumor   (2005-01-18 00:24:00) [3]

Что касается кнопки:
Ищешь окно, где расположена кнопка (FindWindow).
Затем пробегаешь по её подчинённым элементам с помощью FindWindowEx, указывая например текст кнопки. Затем посылаешь ей сообщение о том что она нажата.
Что касается меню. Также ищешь окно, где расположено меню (FindWindow). Затем получаешь его меню (GetMenu), Перечисляешь его пункты (всего их GetMenuItemCount) и ищешь нужный (GetMenuItemInfo). Далее берёшь хендл подменю, например подменю Файл (GetSubMenu). перечисляешь подменю аналогичным образом как и с главным меню. Находишь нужное - посылаешь сообщение о том, что оно нажато.
На самом деле, в самом простом случае иногда достаточно знать параметры сообщения WM_COMMAND чтобы симитировать нажатие кнопки или пункта меню. Эти параметры можно отловить через Spy или WinSight.
А теперь за книжки, и читать про все указанные здесь функции :)


Eraser   (2005-01-17 20:54:00) [4]

grigory ©
А слышал про понятие ДЕСКРИПТОР?


grigory   (2005-01-17 20:49:00) [5]

просто не совсем пойму..как конкретно выбрать определенную кнопку..например нажать "файл",а затем пункт меню! Как имя кнопки узнать, чтоб уже послать СендМесседж конкретно ей!


Sumor   (2005-01-12 21:20:00) [6]

2 варианта и совершенно разные:
1. Нужно работать со своим, но другим приложением. Тогда действительно лучше COM, возможно устаревший DDE или просто Pipe/mailslot

2. Нужно работать с чужим приложением, которое конечно же не умеет нажимать на кнопки через COM. Тогда необходимо найти нужную кнопку на экране с помощью FindWindow и FindWindowEx и послать ей сообщение SendMessage (или PostMessage). Типы сообщений представлены в справке. Некоторые сообщения не хотят посылаться чужим окнам, опять же читайте справку, возможно надо AttachThreadInput или что-то ещё


Eraser   (2005-01-12 21:16:00) [7]

GanibalLector
для того чтобы использовать COM необходимо, чтобы приложение, которым ты хочешь управлять, поддерживало то самый COM, ну ка поуправляй Winamp'om при помощи COM... а через сообщения- как два пальца об асфальт))


Anatoly Podgoretsky   (2005-01-12 21:09:00) [8]

Партия дай порулить.


GanibalLector   (2005-01-12 20:49:00) [9]

2 grigory[0]
Нормальные пацаны COM для этого используют.Скажу больше,на этом форуме как раз есть ветка "COM и Corba".


Eraser   (2005-01-12 16:47:00) [10]

grigory
Именно SendMessage или PostMessage.


grigory   (2005-01-12 16:44:00) [11]

а можно хотя бы кратко пояснить что именно она делает..и с каким приложением работает,как имя получает? и еще про переменные..какого типа?


kaZaNoVa   (2005-01-12 16:32:00) [12]

кусок реально работающего кода
(писал давно, просьба не пинать:)))

procedure TForm1.Button4Click(Sender: TObject);
begin
TxtLength := SendMessageTimeout(w,WM_GETTEXTLENGTH,0,0,SMTO_NORMAL,700,w1);
txtlength := txtlength+1;
setlength (buffer, 412);
SendMessageTimeout(w,wm_gettext,412,longint(@buffer[1]),SMTO_NORMAL,750,w1);
label2.Caption:=inttostr(currentuin);
if currentuin>login( buffer) then currentuin:=login( buffer);
if currentuin=login( buffer) then exit;
currentuin:=login( buffer);

Potok:=TFailo.Create(true);
Potok.Priority:=tpLowest;
Potok.FreeOnTerminate:=true;
Potok.Resume;

SetWindowPos(Handle, HWND_TOPMOST, Left, Top,//поверх всех окон
Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE) ;

end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо