Вопросы по AkelPad Plugin API.
- Author
- Message
-
Offline
- Site Admin
- Posts: 6311
- Joined: Thu Jul 06, 2006 7:20 am
-
Offline
- Posts: 876
- Joined: Tue Jul 24, 2007 8:54 am
Как прекратить обработку сообщения WM_KEYUP/DOWN, если оно уже обработано в собственной процедуре, подставленной в цепь обработки через AKD_SETEDITPROC? Пробовал возвращать и LRESULT(True), и 0, и не вызывать NextProc - всё равно пропускается.
Код кратко:
Код кратко:
Code: Select all
...
pwpd := nil;
SendMessage(AkelData.hMainWnd, AKD_SETEDITPROC, WPARAM(@SubclProc), LPARAM(@pwpd));
...
function SubclProc(hWnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
Processed: Boolean;
begin
Processed := False;
case uMsg of
WM_KEYDOWN, WM_SYSKEYDOWN:
Processed := True;
WM_KEYUP, WM_SYSKEYUP:
Processed := True;
end; // case uMsg
if Processed then Exit(LRESULT(True)); <== добавил по аналогии с сорсом SmartSel
if (not Processed) and ((pwpd <> nil) and Assigned(pwpd.NextProc)) then
Result := pwpd.NextProc(hWnd, uMsg, wPar, lPar)
else
Result := 0;
end;
-
Offline
- Posts: 876
- Joined: Tue Jul 24, 2007 8:54 am
-
Offline
- Posts: 876
- Joined: Tue Jul 24, 2007 8:54 am
Instructor
в нескольких последних версиях странная вещь творится.
Плагин с одной резидентной функцией (автозапуск, UD_NONUNLOAD_ACTIVE) и функциями по требованию. Сценарий следующий:
1) Запускаем Акель, резидентная ф-я загружается
2) Вызываем ф-ю по требованию
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH, производится очистка переменных, снятие хуков и прочее. Но резидентная-то функция должна быть до сих пор активна, и оставаться таковой до закрытия Акеля!
Судя по Log плагину, проблема решается сабклассингом главной процедуры и ловлей AKDN_MAIN_ONFINISH. Это правильный путь?
upd Попробовал снимать сабкласс в AKDN_MAIN_ONFINISH - вообще страшные вещи стали стали происходить.
в нескольких последних версиях странная вещь творится.
Плагин с одной резидентной функцией (автозапуск, UD_NONUNLOAD_ACTIVE) и функциями по требованию. Сценарий следующий:
1) Запускаем Акель, резидентная ф-я загружается
2) Вызываем ф-ю по требованию
3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH, производится очистка переменных, снятие хуков и прочее. Но резидентная-то функция должна быть до сих пор активна, и оставаться таковой до закрытия Акеля!
Судя по Log плагину, проблема решается сабклассингом главной процедуры и ловлей AKDN_MAIN_ONFINISH. Это правильный путь?
upd Попробовал снимать сабкласс в AKDN_MAIN_ONFINISH - вообще страшные вещи стали стали происходить.
-
Offline
- Posts: 2247
- Joined: Tue Aug 07, 2007 2:03 pm
- Location: Vinnitsa, Ukraine
У Вас проблема в пункте 3. Если Вы хотите что-бы после завершения функции по-требованию резидент(весь плагин) оставался Вы должны вернуть UD_NONUNLOAD_NOTACTIVE. А Вы вероятно возвращаете UD_UNLOAD, при котором АР послушно(не смотря что другие функции активны) выгружает из памяти Ваш плагин(и Вы получаете DLL_PROCESS_DETACH). Т.е. Вы внутри плагина должны следить за состоянием и решать что возворащатть UD_UNLOAD или UD_NONUNLOAD_NONACTIVE. Это и будет решением проблемы. (Я так у себя в SpellCheck делаю: резидентом выставляю флажок активности функции(по факту там переменная рабочая на не NULL проверяется), а функции по требованию смотрят на него и корректируют UD_*.)3) Ф-я завершается
4) DLLMain плагина вызывается с параметром DLL_PROCESS_DETACH,
Вообще DLL_PROCESS_DETACH это последний шанс DLL-ке/плагину почистить за собой хвосты, тв т.ч. удостоверится что больше никто не знает указателей на память в которую загружена DLL и не будет пытаться туда писать/читать, передавать управление.
AKDN_MAIN_ONFINISH - да, этот хук нужно ловить что-бы отключить плагин корректно при выключении АР. Я так делаю в Templates.
-
Offline
- Posts: 3
- Joined: Sat Dec 06, 2014 9:16 am
А где ман по plugin api?
А где собственно ман по plugin api? Он существует?
Как хотя бы получить Н-ный аргумент при вызове некоего метода плагина в виде строки?
Как хотя бы получить Н-ный аргумент при вызове некоего метода плагина в виде строки?