Плагин на основе WebBrowser: перехватить клавиши

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Плагин на основе WebBrowser: перехватить клавиши

Сообщение Alextp »

Есть LS плагин на основе TWebBrowser (Delphi): OpenOffice.org Viewer.
Не могу релизнуть его из-за одного момента.

Не могу понять, как отдать Листеру наживаемые в браузере кнопки 1-8, F, W, теперь еще и другие (C, L - ну и намутил же Гислер!)
Собственно отдать я могу, но не могу перехватить факт нажатия, т.к. в WB не события OnKeyPress/OnKeyDown, точнее оно есть, но не работает. Как быть?
Аватара пользователя
Nik
Сообщения: 583
Зарегистрирован: Сб янв 01, 2005 13:00
Откуда: Киров
Контактная информация:

Сообщение Nik »

Я когда-то искал подобную информацию по GekoBrowser (на котором WebView построен), но так и не нашёл ничего дельного :( Если найдёшь - поделись, плиз :)
Качественный хостинг.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Nik
У меня есть кое-что, но как это реализовать, не знаю:
Дали подсказку: по идее, у WebBrowser должна быть структура
OLEINPLACEFRAMEINFO, в которой можно задать такой параметр, как
IOleInPlaceSite::GetWindowContext
Вот в нем, кажется можно задать свой обработчик клавиш или что-то вроде этого.
Подробностей человек не дал, а я сам не разобрался.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Вот нашел чего:
http://www.swissdelphicenter.ch/en/showcode.php?id=1055
Кажется, это то что нужно.. в примере перехватываются клавиши стрелок.

Edit
Не годится, там задается обработчик Application.OnMessage, которого в плагине - нету.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

А так ли нужен этот обработчик? Если я правильно понял задачу - можно пойти по другому пути: поставить хук на нажатия клавиш, все обработчики написать самому на WinAPI. Т.е. отлавливать все нажатия внутри окна листера и проверять, какой именно контрол активен. Хук нужен будет локальный, что реализовать довольно просто.
Хотя я WLX-плаги не писал и с TWebBrowser не ковырялся - возможно там какие-то свои заморочки...
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

В крайнем случае подойдет и хук (тем более локальный)... Но если можно реализовать средствами WebBrowser, лучше сделать через него. Интересно, будет этот хук работать с ActiveX?
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

А почему бы не попробовать? Сейчас по быстрому накидаю код, выложу, как быдет готово.

Добавлено: по быстрому не получилось, на выходных кину.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

В общем выяснилось, что хуку плевать на ActiveX, работает как угодно. Но, к моему величайшему позору, нормально работающий локальный хук мне поставить не удалось. Хук ставится согласно всем возможным мануалам, работает - но при переключении на любое окно, кроме моей программы тут же убивает его процесс.
Самое интересное - что раньше я это неоднократно делал и всё работало.
При переделке на глобальный хук - всё работает. В чём проблема - понять не могу.

Здесь небольшая программка, которая отлавливает нажатия клавиш и отслеживает все параметры, с этим связанные. Взять из неё участки кода для плагина труда не составит.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Посмотрел, не очень понятно (пока). %)
Непонятно, какие участки кода в программе отвечают за хуки. И как надо переписать модуль Hook.pas примен-но к моему плагу... Если найдете время посмотреть на мой плаг, то исходник здесь:
http://wincmd.ru/plugring/OOSimpleViewer.html , в папке WLXViewer...
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Гм... я то-думал там простой код... Под hook.pas наверно имеется в виду hook.dpr? Это библиотека, в которой находится сама ловушка...
В общем, посмотрю код плагина, может что придумаю.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Под hook.pas наверно имеется в виду hook.dpr? Это библиотека, в которой находится сама ловушка...
Да, hook.dpr.
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

Код из папки WLXViewer не компилится. Ругается на отсутствие Compilers.inc (юнит WBProc). Пробовал Delphi6/Delphi2005.
Могу встроить ловушку в WLXViewerPlain.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Код из папки WLXViewer не компилится. Ругается на отсутствие Compilers.inc (юнит WBProc).
Ops!! Обновил.
Могу встроить ловушку в WLXViewerPlain.
В WLXViewerPlain нет WebBrowser...
Аватара пользователя
D1P
Сообщения: 2987
Зарегистрирован: Пн дек 20, 2004 18:30
Откуда: Тбилиси
Контактная информация:

Сообщение D1P »

В WLXViewerPlain нет WebBrowser...
А это без разницы. Главное то, что пока я ждал обновления, в Plain-версию хоткей встроил - это оказалось просто. В общем, сейчас приделаю к этой версии, откомментирую и кину.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Заранее спасибо!

Проверить на этой версии надо так: инсталлируем плагин в TC и открываем файл - если клавиши "1"-"8" в плагине работают, то все ОК.
Ответить