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

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

Найди дескриптор кнопки. [D7, XP]


Страницы:   1 2

Псарь ©   (2011-12-20 08:55:00) 

Всем привет!

Есть сторонняя программа.
Цель нажать на одну единственную кнопку в этой программе.

Что знаю:
(Узнал через WindowFromPoint)

1) Программа написана на Delphi.
2) Знаю класс главной формы программы, его title.
3) Кнопка находится на TCoolBar'e.
4) На кнопке написано "Старт".

Странности:
1) Не могу определить класс, title этой кнопки. (GetClassName, GetWindowText + WindowFromPoint).

Как обнаружить хэндл этой злосчастной кнопки?


Псарь   (2011-12-22 12:17:00) [1]

EnumChildWindows(Wnd, @EnumChildProc, 0); возвращает False,
GetLastError выводит немногословное "OS function fail" и все.


Псарь   (2011-12-22 12:09:00) [2]


> han_malign   (22.12.11 08:33) [22]


> Короче wnd:= GetWindow(wnd, GW_CHILD);


Wnd2 возвращает ноль:

Wnd2:= GetWindow(Wnd, GW_CHILD);


> либо  EnumChildWindows.


function EnumChildProc(wnd:HWND; lP: LPARAM):BOOL;
begin
 Form1.Caption:= 'Вошли';
 Form1.Memo1.Lines.Add(IntToStr(Wnd));

 Result:= BOOL(True);
end;

. . . . .

 Wnd:= FindWindowEx(FindWindow('TForm1', nil), 0, 'TCoolBar', nil);
 If (Wnd <> 0) then
 begin
    Form1.Memo1.Clear;
    EnumChildWindows(Wnd, @EnumChildProc, 0); // Да же не выводит "Вошли".

    // Хотя так выодит: EnumChildWindows(Form1.Handle, @EnumChildProc, 0);
 end;


Ничего не пойму. :\


Псарь   (2011-12-22 12:06:00) [3]


> han_malign   (22.12.11 08:33) [22]
>
>
> > Там Дельфевый TCoolBar.
>
> - это обертка на виндовый Rebar...


Понятно. Спасибо.
Значит там настоящие кнопки... хм...


han_malign   (2011-12-22 08:33:00) [4]


> Там Дельфевый TCoolBar.

- это обертка на виндовыйRebar...
У которого создаются полосы(band) в контексте которых добавляются дочерние окна...

Короче wnd:= GetWindow(wnd, GW_CHILD);либо   EnumChildWindows...


Псарь   (2011-12-22 08:31:00) [5]


> Dennis I. Komarov ©   (21.12.11 21:30) [20]
>
> дискриптор, он у окна, а не у кнопки... чего ищем?


Понятно что не у кнопки. Т.к. кнопка как выяснилось - графическая.
А ищем ошибку - почему не работает эмуляция нажатия.


Dennis I. Komarov   (2011-12-21 21:30:00) [6]

дискриптор, он у окна, а не у кнопки... чего ищем?


Псарь   (2011-12-21 18:19:00) [7]


> han_malign   (20.12.11 14:18) [16]


Там Дельфевый TCoolBar.

- - -

Ошибку я так и не нашел.


QAZ   (2011-12-20 16:51:00) [8]


> OW ©   (20.12.11 14:47) [17]

не вижу связи
или это попытка сарказма?


OW   (2011-12-20 14:47:00) [9]


> чтобы нажать кнопку тулбара мышь вообще ненужна

да
и много чего - не нужна тоже.

А если программа имеет какой-нибудь TImage в качестве кнопки, с картинкой кнопки и обработчиками onMouseDown|UP, для всяческих эффектов?


han_malign   (2011-12-20 14:18:00) [10]


> но ПО НЕПОНЯТНЫМ ПРИЧИНАМ не работает.

- дык, Rebar Control - является контейнером дочерних окон, которые и надо дергать.
А уж панельтам с безоконными кнопками, или честный Toolbar- это отдельный вопрос...


Псарь   (2011-12-20 13:03:00) [11]

Вообщем программа эта Твидиум: http://www.twidium.com/
Вот код:


procedure EmulClick(Wnd: HWND; X, Y: LongInt);
begin
 PostMessage(Wnd, WM_LBUTTONDOWN, 0, MAKELPARAM(X, Y));
 PostMessage(Wnd, WM_LBUTTONUP,   0, MAKELPARAM(X, Y));
end;

procedure Func;
const
 OFFSET = 13;
var
 R  : TRect;
 Wnd: HWND;
begin
 // Отключаем высплывающее окно.
 Wnd:= FindWindow('TMessageForm', nil);
 If (Wnd <> 0)
 then PostMessage(Wnd, WM_KEYDOWN, VK_RETURN, 0);

 // Нажимаем на графическую кнопку.
 Wnd:= FindWindowEx(FindWindow('TForm1', nil), 0, 'TCoolBar', nil);
 If (Wnd <> 0) then
 begin
   GetWindowRect(Wnd, R);
   EmulClick(Wnd, R.Left + OFFSET, R.Top + OFFSET);

   SetCursorPos(R.Left + OFFSET, R.Top + OFFSET); // For test.
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Func; // Интервал в 1 сек.
end;



Вроде все правильно, но ПО НЕПОНЯТНЫМ ПРИЧИНАМ не работает.
Подскажите.


Псарь   (2011-12-20 13:00:00) [12]


> KilkennyCat ©   (20.12.11 10:33) [9]
>
> а так?


Спасибо.
Кинул на форму TSpeedButton, проверил, работает. :)
До этого PostMessage пытался, да не правильно передавал параметры.

- - -

Начал тестить на программе, но не пашет. :\


QAZ   (2011-12-20 12:47:00) [13]


> OW ©   (20.12.11 12:14) [12]

кошмаркакой

чтобы нажать кнопку тулбара мышь вообще ненужна


OW   (2011-12-20 12:14:00) [14]

имхо, универсальный метод попадался как-то
screenshot экрана и поводить по нему заранее вырезанным изображением места, куда надо ткнуть (и прилегающей к месту окрестности), найдя совпадение(оно должно быть совсем точным), эмулируем клик мыши.
Зато работает всегда


QAZ   (2011-12-20 12:09:00) [15]

ему от мыши нужен тока клик,а использует он координаты курсора


KilkennyCat   (2011-12-20 10:35:00) [16]

5-ый пост тамошний имеется ввиду.


KilkennyCat   (2011-12-20 10:33:00) [17]

а так? http://programmersforum.ru/showthread.php?p=113062


Псарь   (2011-12-20 10:25:00) [18]


> KilkennyCat ©   (20.12.11 10:16) [6]
>
> координаты абсолютные? экранные?


Экранные.


> типа так:


Работает, но курсор переносится на кнопку...
Фоновая работа будет исключена, не подходит.


KilkennyCat   (2011-12-20 10:17:00) [19]

типа так:
http://www.delphisources.ru/pages/faq/base/use_mouse_event_for_emulation.html


KilkennyCat   (2011-12-20 10:16:00) [20]

координаты абсолютные? экранные?


Страницы:   1 2

Наверх

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