Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1256278384
Morgan128
2009-10-23 10:13
2012.04.15
Управление процессами с определенным PID


15-1322937752
Андрей Билан
2011-12-03 22:42
2012.04.15
Перевод проекта с Delphi 5 на Delphi XE


15-1323919290
Я
2011-12-15 07:21
2012.04.15
на чем делать гуи


15-1323809010
Германн
2011-12-14 00:43
2012.04.15
Загрузочное меню


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский