Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.15;
Скачать: CL | DM;

Вниз

Найди дескриптор кнопки.   Найти похожие ветки 

 
Псарь   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
4-1256278384
Morgan128
2009-10-23 10:13
2012.04.15
Управление процессами с определенным PID


15-1323763792
Dennis I. Komarov
2011-12-13 12:09
2012.04.15
WinXP без GUI...


8-1225446685
parasolka
2008-10-31 12:51
2012.04.15
Конвертиорвание jpeg в gif.


8-1223290961
BREND
2008-10-06 15:02
2012.04.15
Обработка видеосигнала


2-1324525285
Богдан
2011-12-22 07:41
2012.04.15
2 задачки на написание программы