Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

DV
Следующий вопрос: каким образом можно изменить (подставить другие) параметры перехваченного сообщения?
Только если поставить хук/сабклассинг самостоятельно, а не через API плагина.
И можно ли запретить обработку сообщения?
retrun != 0;(вернуть не нулевое значение).
Я столкнулся с этими проблемами ещё в том году(в начале декабря), когда начинал писать SetCoderExt.js и проконсультировался с Инструктором в личке.(Начальная версия скрипта который пришлось переделать.)
Если поглядишь на исходник, то увидишь что вызывается твоя JS функция, проверяется результат на 0, и если равно 0, то вызывается родная функция. Инструктор это взял видимо из MSDN, где очень часто написано, что если стандартная процедура не обрабатывает сообщения, то она возвращает ноль. Но это только справедливо для стандартной процедуры, и далеко не для всех стандартных(<WM_USER) сообщений. Ибо обработка некоторых сообщение предполагает возврат 0, и он не может быть индикатором "необработки".
В моём случае, не нужно было подставлять другие аргументы сообщениям, потому я обошелся, и больше не сидел на шее Инструктор "исправляй". В твоем - чего не знаю, того не знаю. Если не получится возвратом != 0, то будем думать.

ЗЗЗЫ: Только что полазил в исходниках и обнаружил: WindowSubClass возвращает значение, которое можно скормить CallWindowProc, таким образом вызвав оригинальную оконную процедуру( до сабкласинга WindowSubClass). Пробуйте.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post 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;
  }
}

Offline
Posts: 1873
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post 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;">, можно опционально.

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post 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.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post 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]

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post 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 (галочка при отправке/редактировании сообщения).

DV
Offline
Posts: 1291
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

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

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post 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 занято акселлератором).

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

CalculatorJS.js

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

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Instructor,
А не показывается, потому что распознается пара "<pre></pre>", т.к. не отключены в этом сообщении HTML...
Точно, ложная тревога. :oops:

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post 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.

Offline
Posts: 2248
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post 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] = "Китайська Традиційна";

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Перестал работать Параметр 2 при вызове скриптов, к примеру

Code: Select all

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

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Andrey_A_A
Убедитесь, что разрешена одновременная работа других скриптов:

Code: Select all

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

Offline
Site Admin
Posts: 6403
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Andrey_A_A
Надумал одно решение вопроса синхронизации запуска скриптов из скрипта :)

Code: Select all

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