Следующий вопрос: каким образом можно изменить (подставить другие) параметры перехваченного сообщения?
Только если поставить хук/сабклассинг самостоятельно, а не через API плагина.
И можно ли запретить обработку сообщения?
retrun != 0;(вернуть не нулевое значение).
Я столкнулся с этими проблемами ещё в том году(в начале декабря), когда начинал писать SetCoderExt.js и проконсультировался с Инструктором в личке.(Начальная версия скрипта который пришлось переделать.)
Если поглядишь на исходник, то увидишь что вызывается твоя JS функция, проверяется результат на 0, и если равно 0, то вызывается родная функция. Инструктор это взял видимо из MSDN, где очень часто написано, что если стандартная процедура не обрабатывает сообщения, то она возвращает ноль. Но это только справедливо для стандартной процедуры, и далеко не для всех стандартных(<WM_USER) сообщений. Ибо обработка некоторых сообщение предполагает возврат 0, и он не может быть индикатором "необработки".
В моём случае, не нужно было подставлять другие аргументы сообщениям, потому я обошелся, и больше не сидел на шее Инструктор "исправляй". В твоем - чего не знаю, того не знаю. Если не получится возвратом != 0, то будем думать.
ЗЗЗЫ: Только что полазил в исходниках и обнаружил: WindowSubClass возвращает значение, которое можно скормить CallWindowProc, таким образом вызвав оригинальную оконную процедуру( до сабкласинга WindowSubClass). Пробуйте.
Posted: Fri May 27, 2011 4:00 pm
by Instructor
Infocatcher, Deim0s
См. Scripts v8.8, CodePoster.js v1.5.
DV wrote:Следующий вопрос: каким образом можно изменить (подставить другие) параметры перехваченного сообщения? И можно ли запретить обработку сообщения?
А теперь по формату копирования.
Нужна опция для <br/> или <br>.
Даже если оставить font (а он, повторюсь, deprecated), то не <font color=#3333cc>, а <font color="#3333cc">. Потому что в кавычках можно всегда, а вот без них – нет.
И лучше все же <span style="color: #3333cc;">, можно опционально.
Posted: Fri May 27, 2011 4:32 pm
by Instructor
KDJ wrote:
Infocatcher wrote:Can you restore support for Ctrl+Enter? This shortcut is easier to use.
Yes, but the solution described by Instructor: viewtopic.php?p=12969&hilit=#p12969
does not work in RichEdit. I don't know, how to turn off Ctrl+Enter in RichEdit.
RichEdit window in AkelPad 4.x is the same as AkelEdit window.
//Arguments
var pFormat=GetArg("Format", "BBCode");
var pEnclose=GetArg("Enclose", "<pre>${result}</pre>");
var bInfo=GetArg("Info", true);
А не показывается, потому что распознается пара "<pre></pre>", т.к. не отключены в этом сообщении HTML (галочка при отправке/редактировании сообщения).
Posted: Fri May 27, 2011 5:56 pm
by DV
Instructor wrote:
DV wrote:каким образом можно изменить (подставить другие) параметры перехваченного сообщения?
Пример
Замечательно!
Вот заготовка того, что я давно хотел сделать в виде плагина: возможность набора русских или украинских символов на английской раскладке. Очень полезно тогда, когда в системе не установлен русский или украинский язык
var alphEng = [ "`1234567890-=\\qwertyuiop[]asdfghjkl;\'zxcvbnm,./",
"~!@#$%^&*()_+|QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?" ];
var alphRus = [ "ё1234567890-=\\йцукенгшщзхъфывапролджэячсмитьбю.",
"Ё!"№;%:?*()_+/ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ," ];
var alphUkr = [ "\'1234567890-=\\йцукенгшщзхїфівапролджєячсмитьбю.",
"\'!"№;%:?*()_+/ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄЯЧСМИТЬБЮ," ];
var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var lpOldEditProc;
if (lpOldEditProc = AkelPad.WindowSubClass(hWndEdit, EditCallback))
{
//Message loop
AkelPad.WindowGetMessage();
AkelPad.WindowUnsubClass(hWndEdit);
}
function EditCallback(hWnd, uMsg, wParam, lParam)
{
if (uMsg == 0x102 /*WM_CHAR*/)
{
var nStart = AkelPad.GetSelStart();
var nEnd = AkelPad.GetSelEnd();
if (nStart != nEnd)
AkelPad.ReplaceSel("");
var ch = String.fromCharCode(wParam);
var n = 0;
var i = alphEng[0].indexOf(ch);
if (i < 0)
{
n = 1;
i = alphEng[1].indexOf(ch);
}
if (i >= 0)
{
if (i < alphRus[n].length)
{
ch = alphRus[n].charAt(i);
oSys.Call("user32::CallWindowProc" + _TCHAR, lpOldEditProc, hWnd, uMsg, ch.charCodeAt(0), lParam);
++nStart;
AkelPad.SetSel(nStart, nStart);
//Skip internal CallWindowProc
return 1;
}
}
}
else if (uMsg == 0x100 /*WM_KEYDOWN*/)
{
if (wParam == 0x78 /*VK_F9*/)
{
//Exit message loop
oSys.Call("user32::PostQuitMessage", 0);
//Skip internal CallWindowProc
return 1;
}
}
}
Пока что подразумевается, что всё это будет отключаться клавишей F9, но отключение почему-то не работает.
В перспективе, помимо отключения скрипта, планируется ещё обратная работа: печать латинских символов при русской раскладке клавиатуры.
Комментарии приветствуются.
KDJ
1. Static item sTxtLoadText is not enough wide to show translation in Ukrainian.
2. Transparency regulators(- and + at top right conner should be lowered a bit(overlapping caption, or not, but 1 think it is better when there will be 1px gap, than sensibility of overlap), and should be moved apart 2px (overlapping each other exactly 2px).
3. See below.
Но на текущий момент вызов не из главного потока скрипта с ожиданием завешения, не самая удачная идея. Т.к. сообщение из этого потока не будут обрабатываться пока не прийдет сообщение к главному потоку.
Posted: Sat May 28, 2011 10:10 am
by Instructor
Andrey_A_A
Надумал одно решение вопроса синхронизации запуска скриптов из скрипта