Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Вниз
Как нажать на кнопку внутри 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.035 c