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