Форум: "Начинающим";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];
ВнизНайди дескриптор кнопки. Найти похожие ветки
← →
Псарь (2011-12-20 08:55) [0]Всем привет!
Есть сторонняя программа.
Цель нажать на одну единственную кнопку в этой программе.
Что знаю:
(Узнал через WindowFromPoint)
1) Программа написана на Delphi.
2) Знаю класс главной формы программы, его title.
3) Кнопка находится на TCoolBar"e.
4) На кнопке написано "Старт".
Странности:
1) Не могу определить класс, title этой кнопки. (GetClassName, GetWindowText + WindowFromPoint).
Как обнаружить хэндл этой злосчастной кнопки?
← →
Псарь (2011-12-20 08:59) [1]И ещё:
На TCoolBar"e находятся 3 кнопки:
"Старт" (Вот она мне и нужна), "Пауза", "Стоп".
Причем WindowFromPoint возвращается один и тот же хэндл (Одно число) для всех этих кнопок и этого TCoolBar"а.
← →
Псарь (2011-12-20 09:01) [2]Сказывается мне, что эти кнопки без хэндлов, т.е. графические.
Предположительно TSpeedButton"ы.
← →
MBo © (2011-12-20 09:02) [3]Например, TSpeedButton - неоконный контрол
← →
KilkennyCat © (2011-12-20 09:57) [4]горячий клавиш не привязан случайно к требуемой кнопке? решение очевидное, конечно, но вдруг проморгал.
← →
Псарь (2011-12-20 10:07) [5]
> KilkennyCat © (20.12.11 09:57) [4]
>
> горячий клавиш не привязан случайно к требуемой кнопке?
> решение очевидное, конечно, но вдруг проморгал.
>
Не, нету.
- - -
Ну вроде разобрался. Точно графические.
Осталось сделать эмуляцию клика в нужной точке экрана.
Написал такое:
procedure EmulClick(X, Y: LongInt);
begin
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
end;
Работает, если навести курсор на нужную кнопку, т.е. параметры "Х" и "Y" - игнорируются.
В чем ошибка?
← →
KilkennyCat © (2011-12-20 10:16) [6]координаты абсолютные? экранные?
← →
KilkennyCat © (2011-12-20 10:17) [7]типа так:
http://www.delphisources.ru/pages/faq/base/use_mouse_event_for_emulation.html
← →
Псарь (2011-12-20 10:25) [8]
> KilkennyCat © (20.12.11 10:16) [6]
>
> координаты абсолютные? экранные?
Экранные.
> типа так:
Работает, но курсор переносится на кнопку...
Фоновая работа будет исключена, не подходит.
← →
KilkennyCat © (2011-12-20 10:33) [9]а так? http://programmersforum.ru/showthread.php?p=113062
← →
KilkennyCat © (2011-12-20 10:35) [10]5-ый пост тамошний имеется ввиду.
← →
QAZ (2011-12-20 12:09) [11]ему от мыши нужен тока клик,а использует он координаты курсора
← →
OW © (2011-12-20 12:14) [12]имхо, универсальный метод попадался как-то
screenshot экрана и поводить по нему заранее вырезанным изображением места, куда надо ткнуть (и прилегающей к месту окрестности), найдя совпадение(оно должно быть совсем точным), эмулируем клик мыши.
Зато работает всегда
← →
QAZ (2011-12-20 12:47) [13]
> OW © (20.12.11 12:14) [12]
кошмаркакой
чтобы нажать кнопку тулбара мышь вообще ненужна
← →
Псарь (2011-12-20 13:00) [14]
> KilkennyCat © (20.12.11 10:33) [9]
>
> а так?
Спасибо.
Кинул на форму TSpeedButton, проверил, работает. :)
До этого PostMessage пытался, да не правильно передавал параметры.
- - -
Начал тестить на программе, но не пашет. :\
← →
Псарь (2011-12-20 13:03) [15]Вообщем программа эта Твидиум: 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;
Вроде все правильно, но ПО НЕПОНЯТНЫМ ПРИЧИНАМ не работает.
Подскажите.
← →
han_malign (2011-12-20 14:18) [16]
> но ПО НЕПОНЯТНЫМ ПРИЧИНАМ не работает.
- дык, Rebar Control - является контейнером дочерних окон, которые и надо дергать.
А уж панель там с безоконными кнопками, или честный Toolbar - это отдельный вопрос...
← →
OW © (2011-12-20 14:47) [17]
> чтобы нажать кнопку тулбара мышь вообще ненужна
да
и много чего - не нужна тоже.
А если программа имеет какой-нибудь TImage в качестве кнопки, с картинкой кнопки и обработчиками onMouseDown|UP, для всяческих эффектов?
← →
QAZ (2011-12-20 16:51) [18]
> OW © (20.12.11 14:47) [17]
не вижу связи
или это попытка сарказма?
← →
Псарь (2011-12-21 18:19) [19]
> han_malign (20.12.11 14:18) [16]
Там Дельфевый TCoolBar.
- - -
Ошибку я так и не нашел.
← →
Dennis I. Komarov © (2011-12-21 21:30) [20]дискриптор, он у окна, а не у кнопки... чего ищем?
← →
Псарь (2011-12-22 08:31) [21]
> Dennis I. Komarov © (21.12.11 21:30) [20]
>
> дискриптор, он у окна, а не у кнопки... чего ищем?
Понятно что не у кнопки. Т.к. кнопка как выяснилось - графическая.
А ищем ошибку - почему не работает эмуляция нажатия.
← →
han_malign (2011-12-22 08:33) [22]
> Там Дельфевый TCoolBar.
- это обертка на виндовый Rebar...
У которого создаются полосы(band) в контексте которых добавляются дочерние окна...
Корочеwnd:= GetWindow(wnd, GW_CHILD);
либоEnumChildWindows
...
← →
Псарь (2011-12-22 12:06) [23]
> han_malign (22.12.11 08:33) [22]
>
>
> > Там Дельфевый TCoolBar.
>
> - это обертка на виндовый Rebar...
Понятно. Спасибо.
Значит там настоящие кнопки... хм...
← →
Псарь (2011-12-22 12:09) [24]
> 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:17) [25]EnumChildWindows(Wnd, @EnumChildProc, 0); возвращает False,
GetLastError выводит немногословное "OS function fail" и все.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c