![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Управлять другим приложением!
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;