|
Вопрос # 6 248/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
...дело такое - надо получить доступ к параметрам компонента ShockwaveFlash в чужом окне...дело в том что Хендл окна и компонента я получил - но как можно используя хендл - получить доступ к параметрам компонента
а точнее надо получить доступ к процедуре PLAY и STOP
var
h, z : hwnd;
findmenu: hmenu;
id:integer;
begin
h:= findwindows('TForm4', nil);
z:= findwindowsex(h, 0, 'MacromediaFlashPlayerActiveX', nil);
if z <> 0 then
begin
windows.setforegroundwindow(h);
findmenu:= getmenu(z);
id:= getmenuitemcount(findmenu); // -1
...
...
...
end;
...вот в чем проблема
id:= getmenuitemcount(findmenu); // -1
тут - ID получает -1 значит оно не видит меню...или я что то не так делаю помогите разобраться...
 |
Вопрос задал: Electronic_Arts (статус: Посетитель)
Вопрос отправлен: 18 августа 2012, 17:34
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 22 августа 2012, 03:32; участников в обсуждении: 2.
|
QWERYTY (статус: Посетитель), 21 августа 2012, 00:52 [#1]:
getmenuitemcount - Вам же пишут в описании что нужно передавать хендл меню, а она вернёт количество пунктов.
Если функция ворачивает -1, то значит она не видит никаких пунктов(ну это вы уже поняли).
Процедуры PLAY и STOP должны быть запрограммированны Action script'ом(да пусть меня поправят если я отстал от жизни).
Очевидно кнопки отрисованны, и какая то функция при кождом клике выполняет действие в соответствии с координатами.
К сожалению решения не могу подсказать. У самого была аналогичная проблема, пытался получить данные из окна, а оказалось что это всё нарисованно. И я даже не мог выяснить что это был за контейнер, и какая использовалась технология.
Штурм был серьёзный, был написан сниффер, внедрял длл(чтоб ковыряться в адр. пространстве процесса), но в итоге пришлось отступить.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
Electronic_Arts (статус: Посетитель), 21 августа 2012, 11:07 [#2]:
Нет ты меня не правильно понял - мне нужно заполучить доступ к меню компонента ShockwaveFlash (тот который отображается при правом клике мышки - ну где Увеличить - показать все - воспроизвести)
|
|
QWERYTY (статус: Посетитель), 21 августа 2012, 14:18 [#3]:
Ну да, получается не понял. Я подумакл про кнопки плеера.
Действительно меню плеера имеет свой хендл, а следовательно функция должна работать. В вашем коде до момента где присваивается Z всё чётко работает?
getmenu
вот что пишут про эту функцию:
Возвращаемые значения
Величина возвращаемого значения - дескриптор меню. Если у заданного окна нет меню, возвращаемое значение ПУСТО (NULL). Если окно - дочернее окно, возвращаемое значение неопределенное.
Замечания
Функция GetMenu не работает с плавающими строками меню. Плавающие строки меню - это специальные элементы управления, которые имитируют стандартные меню; они - не меню. Чтобы получить дескриптор плавающей строки меню, используйте Активизацию специальных возможностей API.
И из вашего кода не очень понимаю где конкретно вы вызываете это меню.
И зачем вы ставите фокус окну которое содержит флэш контейнер, а не самому контейнеру?
Вы пробовали отправить сообщение на хендл этого флеш контейнера с сообщением о правом клике мыши? Если меню появится найдите его по классу(у меня имя оказалось пустым), и примените getmenuitemcount.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 21 августа 2012, 14:25 [#4]:
Походу меню генерят по правому клику, и на момент когда вы пытаетесь извлеч хендл меню его не существует.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
Electronic_Arts (статус: Посетитель), 21 августа 2012, 20:55 [#5]:
Скорее всего да меню генерится только при правом клике -
но ведь до
getmenuitemcount(findmenu);
все четко работает - в getmenu(z); есть результат...
я пробовал ставить фокус на саму флеш контейнеру но результат такой же...
|
|
QWERYTY (статус: Посетитель), 22 августа 2012, 03:05 [#6]:
На си попробуйте тоже самое сделать.
В эмбаркадеровском делфи уже три раза на баги натыкался.
Ну про мелкие я молчу, типа не описанного макроса, который судя из справок должен быть.
Но я сильно удивился когда он мне начал подчёркивать функцию OpenThread, при этом OpenProcess работала(то есть что нужно я подключил в юзес). Пришлось грузить библиатеку с этой функцией и искать адрес.
Или когда функция WriteFile ни в какую не хотела писать в СОМ порт.
Было прочитанно много литературы, но всё в пустую.
Потом я сделал то же самое на си, и всё тут же заработало.
С кодом ничего не делал, ну только подправил для компилятора.
Так что если хоть чуток на си умеете писать, то стоит проверить. Возможно очередной делфовский баг.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
|
QWERYTY (статус: Посетитель), 22 августа 2012, 03:32 [#7]:
#32768 - Это показывает WndInfo когда наводишь на меню.
Это возвращают функции которые извлекают клас окна.
В общем это атом. # в делфи сообщает что оставшаяся часть строки преобразуется в атом.
Например если ищем окно, и указываем клас #32770, то ищется 0x8002, а не строка #32770.
Почитайте что это за окна, может функция не способна с такими работать.
ВЕРИТЬ ВО ВНЕЗЕМНЫЕ ЦИВИЛИЗАЦИИ НЕ ОЗНАЧАЕТ ВЕРИТЬ В ИНОПЛАНЕТЯН.
|
31 августа 2012, 18:54: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Delphi » Программирование с помощью API модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|