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

Вниз

Как нажать на кнопку внутри Flash ролика?   Найти похожие ветки 

 
ZDima ©   (2004-06-06 18:46) [0]

Здравствуйте, уважаемые программисты.
У меня возникла такая задача:
Есть окно 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
Сделал, чтоб моя программа посылала точно то же, но без результатов :(
Люди, Като что посоветует?


 
GanibalLector ©   (2004-06-06 19:42) [1]

IMHO не возможно


 
GanibalLector ©   (2004-06-06 19:49) [2]

Почему???Да потому,что ни IE ни Flash не имеют хендлов внутренних кнопок и прочего.Единственное,так это хендл окна IE and Flash,но не более.

З.Ы. Хочешь сам проверь.Найди сканер окон...да потыкай на кнопки свои.


 
ZDima ©   (2004-06-06 20:25) [3]

да знаю я, что не у них хендлов, но виндос же посылает им как-то сигналы, что мышь нажали! или по твоему IE сам догадываеться?


 
GanibalLector ©   (2004-06-06 20:31) [4]

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


 
Sanek_metaller ©   (2004-06-06 20:38) [5]

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


 
ZDima ©   (2004-06-06 21:08) [6]

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


 
nikkie ©   (2004-06-06 22:05) [7]

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


 
ZDima ©   (2004-06-06 23:46) [8]

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


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

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

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

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

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


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

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


 
GanibalLector ©   (2004-06-07 01:56) [11]

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


 
nikkie ©   (2004-06-07 02:57) [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). понятное дело окно, в которое хотим кликнуть, надо вывести на передний план.


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

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


 
ZDima ©   (2004-06-07 15:13) [14]

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


 
Elf ©   (2004-06-07 20:32) [15]

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

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


 
GanibalLector ©   (2004-06-07 20:35) [16]

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


 
Elf ©   (2004-06-07 20:41) [17]

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

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


 
Sanek_metaller ©   (2004-06-07 21:38) [18]

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


 
ZDima ©   (2004-06-07 22:56) [19]

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


 
akvilon ©   (2004-06-07 23:25) [20]

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


 
Elf ©   (2004-06-08 12:18) [21]

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
ОК. Можно окно искать по классу.


 
nikkie ©   (2004-06-08 14:06) [22]

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


 
ZDima ©   (2004-06-08 15:12) [23]

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
14-1088184065
XeLax
2004-06-25 21:21
2004.07.18
Узнать имя сообщения по номеру


3-1088270520
YA
2004-06-26 21:22
2004.07.18
Ограничение доступа к записи таблицы


1-1089200259
Васька
2004-07-07 15:37
2004.07.18
Почта и интернет по щелчку


1-1088954304
Солер
2004-07-04 19:18
2004.07.18
Как заставить программу запускаться в определённое время?


3-1087770767
Stalker
2004-06-21 02:32
2004.07.18
InterBase, даты....