Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2009, 19:05   #1
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
Вопрос Работа с чужим окном

Здравствуйте, вопросик. Объясните как можно из любого окна вытащить любую информацию и занести туда другую (зная хэндл и класс окна и объекта). И как в другом окне кликнуть на кнопку. Если можете объясните толково и если не сложно с примерами.

Заранее спс всем
W0LF вне форума Ответить с цитированием
Старый 13.10.2009, 19:17   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Вот так например можно порисовать на чужом окне:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
h:hwnd;
begin
h:=findwindow('MozillaUIWindowClass',nil);
Rectangle(getdc(h),0,0,screen.Width div 2,screen.Height div 2);
Ellipse(getdc(h),screen.width div 2,screen.Height div 2,screen.Width,screen.Height);
ReleaseDC(h,getdc(h));
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 13.10.2009, 19:21   #3
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Интересно, спс, но не то =) хотелось бы по теме узнать

Ну вот например как взять информацию из чужого окна из простого едита, сохранить в переменную и поменять текст с того едита на текст, ну например "Hello world" ?

Последний раз редактировалось W0LF; 13.10.2009 в 19:26.
W0LF вне форума Ответить с цитированием
Старый 13.10.2009, 19:25   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Чтобы щелкнуть на кнопку, нужно получить её хендл, а потом использовать SendMessage(but, BM_CLICK, 0, 0);, где but - хендл кнопки.
Основное окно ищется с помощью adder:=FindWindow('TAddContactForm. UnicodeClass', 'Program Name');, где adder - переменная, куда положиться хендл, 'TAddContactForm.UnicodeClass', 'Program Name' - класс окна и его заголовок соответсвенно (можно писать только что-то одно, как в примере ниже).

Далее начинаем искать кнопку:
but:=FindWindowEx(adder, 0, 'TPanel', nil); - tpanel - класса объекта содержащего кнопку, nil - и его заголовок (или можно не использовать)

but:=FindWindowEx(but, 0, 'TTntPageControl.UnicodeClass', nil);
but:=FindWindowEx(but, 0, 'TTntTabSheet.UnicodeClass', 'sheetFirst');
but:=FindWindowEx(but, 0, 'Button class', 'Text');

В данном случае мы найдёём кнопку которая находилась в
'TPanel'->'TTntPageControl.UnicodeClass'->'TTntTabSheet.UnicodeClass'->Наша кнопка

FindWindow(Ex) возратит 0, если не найдёт подходящего контрола.



2. Получить текст окна можно тоже с помощью sendmessage(или postmessage) используя wm_gettext вместо bm_click (как Вы уже догадались - это сообщения виндоса =) )

Цитата:
Сообщение: wm_gettext Копиpует текст, связанный с окном, в имеющийся буфеp.

Паpаметpы:
wparam: Максимальное число байт, котоpые могут быть скопиpованы в буфеp lparam.
lparam: Является указателем на буфеp. Буфеp должен иметь длину не менее wparam байт. Возвpащаемое значение: Если окно является блоком списка и нет выбpанных элементов, возвpащается lb_err. если окно является комбиниpованным блоком, не имеющим оpгана упpавления pедактиpованием, возвpащается cb_err. В пpотивном случае, возвpащается число скопиpованных байт, включая пустой символ окончания. Комментаpии: Для оpганов упpавления pедактиpованием текст является содеpжимым оpгана упpавления pедактиpованием. Для оpганов упpавления кнопок текст является именем кнопки. Для комбиниpованных блоков текст является содеpжимым оpгана упpавления pедактиpованием комбиниpованного блока. Для всех дpугих окон текст является заголовком окна. См. также wm_gettextlen и wm_settext.

Сообщение: wm_gettextlength Возвpащает длину в байтах текста, связанного с окном
TwiX вне форума Ответить с цитированием
Старый 13.10.2009, 19:36   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Вот могучая кучка:
Код:
procedure TForm2.Button2Click(Sender: TObject);
var
h,bh:hwnd;
c:PAnsiChar;
r:trect;
lp:tpoint;
begin
h:=findwindow('TForm1',nil);
if h<>0 then
bh:=findwindowex(h,0,'TButton',nil);
if bh<>0 then
begin
   windows.GetWindowText(bh,c,255); //Получаем текст
   windows.SetWindowText(bh,'MY'); //Ставим текст
   windows.GetWindowRect(bh,r);
   lp:=mouse.CursorPos;
   windows.SetFocus(h);
   Setcursorpos(r.left,r.Top);
mouse_event(MOUSEEVENTF_LEFTDOWN,MOUSEEVENTF_ABSOLUTE,MOUSEEVENTF_ABSOLUTE,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,MOUSEEVENTF_ABSOLUTE,MOUSEEVENTF_ABSOLUTE,0,0);
   mouse.CursorPos:=lp;
end;
end;
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 13.10.2009, 19:48   #6
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Вот тут описание всех wm_* комманд:
http://articles.org.ru/cfaq/index.php?qid=1139&catid=77
TwiX вне форума Ответить с цитированием
Старый 13.10.2009, 20:08   #7
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Ссылка чото не работает
W0LF вне форума Ответить с цитированием
Старый 13.10.2009, 20:34   #8
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Странно, только вчера открывал - до сегодня открытая висела - сервак по ходу опустили - надо подождать)
В моём примере что-то не понятно?)
TwiX вне форума Ответить с цитированием
Старый 13.10.2009, 21:26   #9
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Вот у меня есть кнопка, она лежит в GroupBox'e, которая лежит на Panel, которая лежит непосредственно на форме.

Я находил хэндл окна, потом на этом окне хэндл панели и т.д., но при окно находит, а следующие элементы нет. Вот так как ты TwiX сказал

Код:
var
  Window,Panel,Group,Button:hwnd;
begin
Window:=FindWindow('TForm1', 'Form1');
//if Window<>0 then ShowMessage('Окно найдено');
Panel:=FindWindowEx(window, 0, 'TPanel','Panel1');
//if Panel<>0 then ShowMessage('Панель найдена') else ShowMessage('Панель НЕ найдена');
Group:=FindWindowEx(Panel, 0, 'TGroupBox','GroupBox1');
//if Group<>0 then ShowMessage('Гроуп найдена') else ShowMessage('Гроуп НЕ найдена');
Button:=FindWindowEx(Group, 0, 'TButton','Button1');
//if Group<>0 then ShowMessage('Буттон найдена') else ShowMessage('Буттон НЕ найдена');
end;
W0LF вне форума Ответить с цитированием
Старый 13.10.2009, 21:36   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я бы через Spy++ проверил иерархию...вы уверенны что она такова?(с точки зрения АПИ а не ВСЛ)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие с чужим редактором Nogard Помощь студентам 7 12.07.2009 15:23
Простейшая работа с чужим приложением... ActiveX Помощь студентам 1 31.01.2008 08:17
Работа с чужим приложением ERASERROR Win Api 2 28.01.2008 15:22
работа с чужим окном RammFan Win Api 1 18.01.2007 20:21
поморгать окном Баламут Общие вопросы Delphi 1 10.11.2006 04:09