Page 82 of 97

Posted: Fri May 27, 2011 1:45 pm
by FeyFre
DV
Следующий вопрос: каким образом можно изменить (подставить другие) параметры перехваченного сообщения?
Только если поставить хук/сабклассинг самостоятельно, а не через 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:Следующий вопрос: каким образом можно изменить (подставить другие) параметры перехваченного сообщения? И можно ли запретить обработку сообщения?

Code: Select all

var hWndEdit=AkelPad.GetEditWnd();
var oSys=AkelPad.SystemFunction();
var lpOldProc;

if (lpOldProc=AkelPad.WindowSubClass(hWndEdit, EditCallback))
{
  //Message loop
  AkelPad.WindowGetMessage();

  AkelPad.WindowUnsubClass(hWndEdit);
}

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x102 /*WM_CHAR*/)
  {
    AkelPad.MessageBox(0, "Key "" + String.fromCharCode(wParam) + "" is pressed. Change it to "a" key.", "", 0);

    oSys.Call("user32::CallWindowProc" + _TCHAR, lpOldProc, hWnd, uMsg, "a".charCodeAt(0), lParam);

    //Exit message loop
    oSys.Call("user32::PostQuitMessage", 0);

    //Skip internal CallWindowProc
    return 1;
  }
}

Posted: Fri May 27, 2011 4:23 pm
by Infocatcher
Instructor wrote:См. Scripts v8.8, CodePoster.js v1.5.
Заработало, спасибо!


А теперь по формату копирования. :)
Нужна опция для <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.

Code: Select all

function EditCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 256) //WM_KEYDOWN
  {
    if (wParam == 13) //VK_RETURN
    {
      if (oSys.Call("user32::GetKeyState", 0x11 /*VK_CONTROL*/) & 0x8000)
      {
        Translate();
        return 1;
      }
    }
  }
  return 0;
}
.

P.S.:
I see that "GetKeyState & 0x8000" worked corrently - GetAsyncKeyState has been replaced with GetKeyState in TabSwitch.js.

Posted: Fri May 27, 2011 5:29 pm
by Deim0s
Instructor,
См. Scripts v8.8, CodePoster.js v1.5.
Спасибо, теперь работает.

Несколько моментов:
Запускаю такой строкой:

Code: Select all

-"CodePoster" Call("Scripts::Main", 1, "CodePoster.js", `-Format="BBCode" -Info=false -Enclose="[code]${result}[/code]"`)
В середину добавляется:

Code: Select all

[i]"<pre>${result}</pre>"[/i]
Пример, копирую:

//Arguments
var pFormat=GetArg("Format", "BBCode");
var pEnclose=GetArg("Enclose", );
var bInfo=GetArg("Info", true);

Копируется так:

Code: Select all

[color=#008000][i]//Arguments[/i][/color]
[color=#3333cc][b]var[/b][/color] pFormat[color=#cc3333]=[/color]GetArg[color=#9933dd]([/color][color=#800000][i]"Format"[/i][/color][color=#cc3333],[/color] [color=#800000][i]"BBCode"[/i][/color][color=#9933dd])[/color][color=#cc3333];[/color]
[color=#3333cc][b]var[/b][/color] pEnclose[color=#cc3333]=[/color]GetArg[color=#9933dd]([/color][color=#800000][i]"Enclose"[/i][/color][color=#cc3333],[/color] [color=#800000][i]"<pre>${result}</pre>"[/i][/color][color=#9933dd])[/color][color=#cc3333];[/color]
[color=#3333cc][b]var[/b][/color] bInfo[color=#cc3333]=[/color]GetArg[color=#9933dd]([/color][color=#800000][i]"Info"[/i][/color][color=#cc3333],[/color] [color=#9932cc][b]true[/b][/color][color=#9933dd])[/color][color=#cc3333];[/color]

Posted: Fri May 27, 2011 5:38 pm
by Instructor
Deim0s
В середину добавляется...
Видимо потому, что оно было в изначальной строке :)

Code: Select all

//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:каким образом можно изменить (подставить другие) параметры перехваченного сообщения?
Пример
Замечательно!
Вот заготовка того, что я давно хотел сделать в виде плагина: возможность набора русских или украинских символов на английской раскладке. Очень полезно тогда, когда в системе не установлен русский или украинский язык :)

Code: Select all

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, но отключение почему-то не работает.
В перспективе, помимо отключения скрипта, планируется ещё обратная работа: печать латинских символов при русской раскладке клавиатуры.
Комментарии приветствуются.

Posted: Fri May 27, 2011 6:36 pm
by Instructor
DV
KeySubst.js
Как я угадал с примером :)

Code: Select all

    var nStart = AkelPad.GetSelStart(); 
     var nEnd = AkelPad.GetSelEnd(); 
     if (nStart != nEnd) 
       AkelPad.ReplaceSel("");
Убрать?

Code: Select all

        ++nStart; 
         AkelPad.SetSel(nStart, nStart);
заменить на

Code: Select all

AkelPad.SendMessage(hWnd, 3377 /*AEM_UPDATECARET*/, 0, 0);
VK_F9 не доходит до оконной процедуры (F9 занято акселлератором).

Posted: Fri May 27, 2011 7:22 pm
by KDJ
CalculatorJS.js

Changed: now the window is not modal.
Added: remembering window position.

Posted: Fri May 27, 2011 8:36 pm
by Deim0s
Instructor,
А не показывается, потому что распознается пара "<pre></pre>", т.к. не отключены в этом сообщении HTML...
Точно, ложная тревога. :oops:

Posted: Fri May 27, 2011 9:21 pm
by KDJ
Instructor wrote:RichEdit window in AkelPad 4.x is the same as AkelEdit window.
Instructor, you are reliable. Thank you very much for your help. Infocatcher will also be pleased.

Translator.js
Restored: shortcut keys Ctrl+Enter, Ctrl+Shift+Enter.

Posted: Fri May 27, 2011 11:17 pm
by FeyFre
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.

Code: Select all

/*********************************************
 Translator.js for AkelPad - Interface language
 Version:       2011-05-28
 Language:      Ukrainian
 Translated by: FeyFre
 *********************************************/

 sTxtCaption    = "Перекладач";
 sTxtUse        = "Use";
 sTxtFromLang   = "Із мови";
 sTxtToLang     = "Мовою";
 sTxtAutoDetect = "Автовизначення мови";
 sTxtSortLang   = "Упорядкування мов";
 sTxtSortCode   = "За кодом";
 sTxtSortName   = "За іменем";
 sTxtTranslate  = "&Перекласти";
 sTxtOptions    = "&Опції";
 sTxtSource     = "Вхідний текст";
 sTxtTarget     = "Переклад";
 sTxtSettings   = "Налаштовування";
 sTxtUndo       = "&Повернути";
 sTxtRedo       = "&Повторити";
 sTxtCut        = "&Вирізати";
 sTxtCopyCB     = "&Копіювати до кишені";
 sTxtInsertAP   = "&Вставити у AkelPad";
 sTxtPasteCB    = "В&ставити із кишені";
 sTxtPasteAP    = "Вс&тавити із AkelPad";
 sTxtDelete     = "В&идалити";
 sTxtSelectAll  = "Ви&ділити все";
 sTxtEntireText = "&Увесь текст";
 sTxtInterface  = "Мова інтерфейсу";
 sTxtLoadText   = "Завантажити виділений текст при запуску";
 sTxtUseFontAP  = "Використовувати шрифт AkelPad";
 sTxtWordWrap   = "Переносити стрічки";
 sTxtRegister   = "Реєстрація:";
 sTxtOK         = "Добре";
 sTxtCancel     = "Скасувати";
 sTxtError      = "Помилка";
 sTxtNoText     = "Нічого перекладати.";
 sTxtNoSupport  = "Ваша система не підтримує XMLHttpRequest.";
 sTxtNoInternet = "Виявлено проблему із підключення до Інтернету.";
 sTxtWait       = "Зачекайте...";
 sTxtUndefined  = "Невизначено";

 aLangs[ 0][1] = "Африкаанс";
 aLangs[ 1][1] = "Арабська";
 aLangs[ 2][1] = "Білоруська";
 aLangs[ 3][1] = "Болгарська";
 aLangs[ 4][1] = "Каталоньска";
 aLangs[ 5][1] = "Чеське";
 aLangs[ 6][1] = "Валлійська";
 aLangs[ 7][1] = "Датська";
 aLangs[ 8][1] = "Німецька";
 aLangs[ 9][1] = "Грецька";
 aLangs[10][1] = "Англійська";
 aLangs[11][1] = "Іспанська";
 aLangs[12][1] = "Естонська";
 aLangs[13][1] = "Перська";
 aLangs[14][1] = "Фінська";
 aLangs[15][1] = "Французька";
 aLangs[16][1] = "Ірландська";
 aLangs[17][1] = "Галійська";
 aLangs[18][1] = "Хінді";
 aLangs[19][1] = "Хорватська";
 aLangs[20][1] = "Креольска";
 aLangs[21][1] = "Угорська";
 aLangs[22][1] = "Індонезійська";
 aLangs[23][1] = "Ісландська";
 aLangs[24][1] = "Італійська";
 aLangs[25][1] = "Іврит";
 aLangs[26][1] = "Японська";
 aLangs[27][1] = "Корейська";
 aLangs[28][1] = "Литовська";
 aLangs[29][1] = "Латвійська";
 aLangs[30][1] = "Македонська";
 aLangs[31][1] = "Малайська";
 aLangs[32][1] = "Мальтійська";
 aLangs[33][1] = "Голландська";
 aLangs[34][1] = "Норвезька";
 aLangs[35][1] = "Польська";
 aLangs[36][1] = "Португальська";
 aLangs[37][1] = "Румунська";
 aLangs[38][1] = "Російська";
 aLangs[39][1] = "Словацька";
 aLangs[40][1] = "Словенська";
 aLangs[41][1] = "Албанська";
 aLangs[42][1] = "Сербська";
 aLangs[43][1] = "Шведська";
 aLangs[44][1] = "Суахілі";
 aLangs[45][1] = "Тайська";
 aLangs[46][1] = "Філіппінська";
 aLangs[47][1] = "Турецька";
 aLangs[48][1] = "Українська";
 aLangs[49][1] = "В'єтнамська";
 aLangs[50][1] = "Їдиш";
 aLangs[51][1] = "Китайська";
 aLangs[52][1] = "Китайська спрощена";
 aLangs[53][1] = "Китайська Традиційна";

Posted: Sat May 28, 2011 12:46 am
by Andrey_A_A
Перестал работать Параметр 2 при вызове скриптов, к примеру

Code: Select all

Call AkelPad.Call("Scripts::Main", 2, "SearchReplace.js")
на vbs скриптах вводит AkelPad в ступор, приходится снимать задачу

Posted: Sat May 28, 2011 5:19 am
by Instructor
Andrey_A_A
Убедитесь, что разрешена одновременная работа других скриптов:

Code: Select all

WScript.Echo("1");
AkelPad.ScriptNoMutex();
AkelPad.Call("Scripts::Main", 2, "SearchReplace.js")
WScript.Echo("2");
Но на текущий момент вызов не из главного потока скрипта с ожиданием завешения, не самая удачная идея. Т.к. сообщение из этого потока не будут обрабатываться пока не прийдет сообщение к главному потоку.

Posted: Sat May 28, 2011 10:10 am
by Instructor
Andrey_A_A
Надумал одно решение вопроса синхронизации запуска скриптов из скрипта :)

Code: Select all

WScript.Echo("1");
AkelPad.Include("..\\SearchReplace.js");
WScript.Echo("2");