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

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

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

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

Сообщение D1P »

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

Сообщение Alextp »

но не нашёл файл ни в исходниках, ни в дистрибе плагина (может плохо искал...). Плаг раньше ни разу не ставил, так что могу чего-то недопонимать; собсно вопрос - где взять файл.
Пока здесь:
http://forum.wincmd.ru/viewtopic.php?t=6353
http://atorg.net.ru/files/wlx_OOoViewer.zip
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

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

Сообщение D1P »

http://super.wincmd.ru/files/wlx_ooovie ... upport.rar

Всё работает, но замечен косяк: если с плагина переключиться на другое окно, потом обратно - работать перестаёт. Почему - хз, может какие-то внутренние заморочки листера. Думаю, это легко победить, если потратить немного времени.

В коде есть комментарии там, где я посчитал это необходимым; весь код, который трогать и, в принципе даже смотреть, не надо, вынесен в отдельный юнит hkproc.pas. Для удобства также переменная fmMain в юните UFormMain сделана глобальной (если критично, можно исправить, но тогда потребуется использовать другой способ вызова процедуры, например через сообщения).
В общем, наводку чего, как и куда я дал, думаю дальше разберёшься.

Да, если используешь Delphi 7 или выше, можно раскомментировать в юните hkproc в функциях VirtualKeyCodeToString/StringToVirtualKeyCode условия, использующие константы VK_ - в D6, который у меня сейчас стоит, этих констант не прописано, дописывать самому было лень, я их просто заремил. Но это не критично.
Аватара пользователя
Alextp
Сообщения: 4957
Зарегистрирован: Вс фев 06, 2005 17:21

Сообщение Alextp »

Хм, я не понял. Ты же хотел сделать -глобальный- хук. А на локальный как раз жаловался, что после переключения туда-сюда все работать перестает. А тут как раз локальный хук и такой случай....

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

Сообщение D1P »

Если на пальцах: локальный хук от глобального отличается тем, что первый работает внутри адресного пространства одного процесса (т.е. код в exe-файле), а второй работает внутри общего для всех процессов адресного пространства (код в динамической библиотеке). Если wlx-плагин не динамическая библиотека - бросьте в меня камнем :).
По идее должны были перехватываться нажатия клавиш во всех окнах, но почему-то что-то не работает. Когда я ставил локальный хук (там и код немного другой), он гючил иначе:
Хук ставится согласно всем возможным мануалам, работает - но при переключении на любое окно, кроме моей программы тут же убивает его процесс.
т.е. стоило мне, скажем, переключиться на Рабочий стол, нажать кнопку - и эксплорер.exe тут же вырубался без всякого предупреждения :)

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

Сообщение Alextp »

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

Сообщение Alextp »

Кажется, решение найдено:
http://forum.sources.ru/index.php?showt ... t&p=570348

Посмотрим, работает ли в плаге объект ApplicationEvents, если работает, то все OK...


Edit
Не работает, ApplicationEvents.OnMessage не вызывается...
Ответить