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

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

Как нажать на кнопку внутри Flash ролика? [D7, WinXP]


Страницы:   1 2

ZDima ©   (2004-06-06 18:46:00) 

Здравствуйте, уважаемые программисты.
У меня возникла такая задача:
Есть окно Internet Explorer-а с flash роликом внутри, и мне нужно из моего приложения нажать на кнопку в этом ролике.
Пробовал как обычно т.е.
PostMessage(dddddd,WM_LBUTTONDOWN,MK_LBUTTON,MakeLong(SpinEdit3.Value,SpinEdit4.Value));
PostMessage(dddddd,WM_LBUTTONUP,MK_LBUTTON,MakeLong(SpinEdit3.Value,SpinEdit4.Value));

Где dddddd – handle окна флешь ролика (класс MacromediaFlashPlayerActiveX)
SpinEdit3.Value, SpinEdit4.Value – координаты мыши.
Не помогает :(
Посмотрел программой Microsoft Spy++ какие сообщения приходят окну dddddd при нажатии – вот его лог (без сообщений repaint и т.п.):
<00001> 00120182 S .....................................WM_MOUSEACTIVATE hwndTopLevel:001501F4 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00002> 00120182 R .....................................WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00003> 00120182 S .....................................WM_NCPAINT hrgn:E70407A5
<00004> 00120182 R .....................................WM_NCPAINT
<00005> 00120182 S .....................................WM_ERASEBKGND hdc:B1010A96
<00006> 00120182 R .....................................WM_ERASEBKGND fErased:False
<00007> 00120182 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:568 yPos:309
<00008> 00120182 S .......................................WM_SETFOCUS hwndLoseFocus:00250288
<00009> 00120182 R .......................................WM_SETFOCUS
<00010> 00120182 P WM_LBUTTONUP fwKeys:0000 xPos:568 yPos:309
<00011> 00120182 S .......................................WM_CAPTURECHANGED hwndNewCapture:00000000
<00012> 00120182 R .......................................WM_CAPTURECHANGED
<00013> 00120182 S .........................................WM_KILLFOCUS hwndGetFocus:(null)
<00014> 00120182 R .........................................WM_KILLFOCUS
Сделал, чтоб моя программа посылала точно то же, но без результатов :(
Люди, Като что посоветует?


ZDima   (2004-06-08 15:12:00) [1]

Elf, nikkie - да какая разница - я и так и так пробовал - не работает! Я для того Spy++ и юзал, чтоб эти параметры точно передать и передовал всё байт в байт!


nikkie   (2004-06-08 14:06:00) [2]

>Elf
у тебя wParam и lParam перепутаны местами.


Elf   (2004-06-08 12:18:00) [3]

ZDima, вопрос на засыпку:
по твоему lParam MK_BUTTON
а wParam координаты?

Выдержка из WinAPI Help


WM_LBUTTONDOWN  
fwKeys = wParam;        // key flags
xPos = LOWORD(lParam);  // horizontal position of cursor
yPos = HIWORD(lParam);  // vertical position of cursor


Parameters

fwKeys

Value of wParam. Indicates whether various virtual keys are down. This parameter can be any combination of the following values:

Value Description
MK_CONTROL Set if the CTRL key is down.
MK_LBUTTON Set if the left mouse button is down.
MK_MBUTTON Set if the middle mouse button is down.
MK_RBUTTON Set if the right mouse button is down.
MK_SHIFT Set if the SHIFT key is down.


xPos

Value of the low-order word of lParam. Specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.

yPos

Value of the high-order word of lParam. Specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.


Я думаю не работало.

2Sanek_metaller
ОК. Можно окно искать по классу.


akvilon   (2004-06-07 23:25:00) [4]

бывает же ... :)


ZDima   (2004-06-07 22:56:00) [5]

Elf, ты мою первую месагу читал? SendMessage(hwnd,WM_LBUTTONDOWN,lParam,wParam); - не работает!
Sanek_metaller, если ты не знаешь координат кнопки, тогда зачем на неё наживать? А ещё есть вариант, как-нибудь из памяти флешь подпрограммы считать координаты - где она там рисует :)
Но это уже из области фантастики и иррационального...


Sanek_metaller   (2004-06-07 21:38:00) [6]

To Elf
Кстати Caption окна Explorer'a:=то что между тегами <title></title>+Microsoft Internet explorer;
Ну а если не знаешь координатов кнопки,а она анимированная?
ЗЫ:Must Die;


Elf   (2004-06-07 20:41:00) [7]

2Всем
Люди! Вы чего! Зачем так мудрить с кликом!
Посылаем IE два сообщения и всё!

...
hwnd:=FindWindow("MastDaj Explorer"); // или как там
LOWORD(lParam):=x;
HIWORD(lParam):=y;
SendMessage(hwnd,WM_LBUTTONDOWN,lParam,wParam);
SendMessage(hwnd,WM_LBUTTONUP,lParam,wParam);
...


GanibalLector   (2004-06-07 20:35:00) [8]

2 Elf ©   (07.06.04 20:32) [15]
Да потому,что не всегда известны координаты кнопок и прочей чепухи.Или еще вариант,предположим ТАМ две кнопки :Play and Exit.И что,тоже рандомом нажимать???


Elf   (2004-06-07 20:32:00) [9]

Все равно так красивее.

2GanibalLector
А почему? Так ведь можно нажать кнопку даже если она из вредности ставится абсолютно по рандому.


ZDima   (2004-06-07 15:13:00) [10]

для Elf - можно узнать координаты окна с флеш роликом, его размеры через GetWindowRect и расчитать координаты кнопки :)


ZDima   (2004-06-07 15:11:00) [11]

to nikkie>Спасибо огромное - работает. Я считаю эту тему закрытой. Координаты ролика и кнопки я знаю - ролик на весь экран и не прокручиваеться -> они постоянны.
Я бы даже упростил этот код -
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);


nikkie   (2004-06-07 02:57:00) [12]

ну примерно так:

 RX := GetSystemMetrics(SM_CXSCREEN);
 RY := GetSystemMetrics(SM_CYSCREEN);
 mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE,
   X * 65536 div RX, Y * 65536 div RY, 0, 0);
 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

кликает в точку с координатами (X,Y). понятное дело окно, в которое хотим кликнуть, надо вывести на передний план.


GanibalLector   (2004-06-07 01:56:00) [13]

2 Elf ©   (07.06.04 00:41) [9]
Это все от Лукавого...


Sanek_metaller   (2004-06-07 00:52:00) [14]

А как кликнуть в определенную точку?


Elf   (2004-06-07 00:41:00) [15]

2 GanibalLector:
// IMHO, твоя задача нерешаемая.

Почему сразу не решаемая?
Есть вариант решения. То есть два.

Первый:мы знаем координаты этой кнопки на экране.
Вариант:чего проще - эмулируем для броузера нажатие мыши в этой точке.

Второй:мы НЕ знаем координат, они меняются, скроллятся итд. Знаем внешний вид этой кнопки(микроскриншот).
Вариант:делаем общий скриншот экрана, ищем кнопку(будет идеальное совпвдение, цвета ведь никак не искажаются). Опять таки "кликаем" броузеру в ту точку. Вот и все.
Да ко второму: нужно на время скриншота убирать мышь и максисимизировать окно, чтобы не получилось несоответствия.


ZDima   (2004-06-06 23:46:00) [16]

nikkie - а поподробней


nikkie   (2004-06-06 22:05:00) [17]

попробуй функцию mouse_event


ZDima   (2004-06-06 21:08:00) [18]

Понятно, что кнопка не может принять сообщение, т.к. кнопка - это не окно, но она и не должна ничего принимать т.к. это флеш ролик и кнопка там бутафорная - IMHO смо окно  MacromediaFlashPlayerActiveX принимает месаги от винды и обрабатывает их - надо знать какие месаги или параметры. Ведь всё = кому-то когда ты физически наживаешь на мышь винда посылает кому-то сообщение об этом и кнопка в ролике "нажимаеться" или я не прав и еть ещё какой-то способ узнать о нажатии клавиши мыши не используя сообщения?


Sanek_metaller   (2004-06-06 20:38:00) [19]

Как говорили:у флэш кнопки нет хэндлера,и полюбому кнопка не сможет принять мессагу,просто не поймет,язык то скриптовый.
Возможный вариант решения проблемы:написать письмо компании Macromedia:)


GanibalLector   (2004-06-06 20:31:00) [20]

2 ZDima
Не знаю,как тебе обьяснить это явление,но там(в ИЕ) все по другому.IMHO, твоя задача нерешаемая.


Страницы:   1 2

Наверх

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