Scripts discussion (4)

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Posts: 351
Joined: Mon Jun 03, 2019 2:33 am

Re: Scripts discussion (4)

Post by AZJIO »

InputBox_function.js не работает на новой версии, даже пример InputBox.js не работает, крашит AkelPad. Может кто поправит?

Offline
Posts: 3248
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: Scripts discussion (4)

Post by VladSh »

Instructor
Результаты обратной трассировки по InputBox_function.js.

Offline
Posts: 3248
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: Scripts discussion (4)

Post by VladSh »

И ещё у меня при попытке вызова FindReplaceFiles.js вылетает сообщение об ошибке:
---------------------------
Scripts plugin
---------------------------
Script: C:\Portable\AkelPad\AkelFiles\Plugs\Scripts\FindReplaceFiles.js
Line: 663
Symbol: 5
Error: Недостаточно места в стеке
Code: 800A001C
Source: Ошибка выполнения JavaScript
---------------------------
Да Нет Отмена
---------------------------
При попытке его закрыть, оно не закрывается, а в цикле появляется ещё одно такое же сообщение, и так до бесконечности. Приходится снимать задачу.

Строка 663 это:

Code: Select all

nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
ОС: Windows 11 Корпоративная, 24H2, 26100.4652, 1000.26100.128.0.

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

Re: Scripts discussion (4)

Post by Instructor »

AZJIO wrote: Sun Aug 10, 2025 2:22 am InputBox_function.js не работает ...
См. Scripts v19.3

AkulaBig wrote: Wed Jul 02, 2025 1:28 pm В скрипте FindReplaceFiles.js под Вин 11 выдает ошибку...
VladSh wrote: Mon Aug 11, 2025 11:04 am И ещё у меня при попытке вызова FindReplaceFiles.js вылетает сообщение об ошибке...
Уведомил KDJ.

Как временное решение: 1. строку

Code: Select all

        nMaxFileSize = parseInt(GetWindowText(lParam), 10);
замените на

Code: Select all

        //+Win11 fix
        var sMaxFileSize = GetWindowText(lParam);

        if (sMaxFileSize == "")
        {
          nMaxFileSize = 0;
          return 0
        }
        nMaxFileSize = parseInt(sMaxFileSize, 10);
        //nMaxFileSize = parseInt(GetWindowText(lParam), 10);
        //-Win11 fix
2. блок

Code: Select all

    nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
    if (nID == IDFILELV)
      nID = IDEDITB;
    else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
      nID = IDSEARCHB;
    oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
замените на

Code: Select all

    //+Win11 fix
    //nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
    //if (nID == IDFILELV)
    //  nID = IDEDITB;
    //else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
    //  nID = IDSEARCHB;
    //oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
    var nDefID = LoWord(oSys.Call("User32::DefDlgProcW", hWnd, 1024 /*DM_GETDEFID*/, 0, 0));
    nID = oSys.Call("User32::GetDlgCtrlID", oSys.Call("User32::GetFocus"));
    if (nID == IDFILELV)
      nID = IDEDITB;
    else if ((nID != IDCURRENTB) && (nID != IDBROWSEB) && (nID != IDHELP1B) && (nID != IDHELP2B) && (nID != IDHELP3B) && (nID < IDSEARCHB))
      nID = IDSEARCHB;
    else
      nID = 0;
    if (nID && nDefID != nID)
      oSys.Call("User32::DefDlgProcW", hWnd, 1025 /*DM_SETDEFID*/, nID, 0);
    //-Win11 fix

Offline
Posts: 351
Joined: Mon Jun 03, 2019 2:33 am

Re: Scripts discussion (4)

Post by AZJIO »

Instructor wrote: Thu Aug 21, 2025 8:02 am См. Scripts v19.3
Спасибо, теперь всё работает.

Offline
Posts: 3248
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: Scripts discussion (4)

Post by VladSh »

Instructor
У меня "временное решение" для FindReplaceFiles.js с новой версией Scripts-плагина не работает - та же ошибка "Недостаточно места в стеке" на строке 663.

Offline
Posts: 351
Joined: Mon Jun 03, 2019 2:33 am

Re: Scripts discussion (4)

Post by AZJIO »

Это? У меня работает.
Image

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

Re: Scripts discussion (4)

Post by Instructor »

VladSh wrote: Fri Aug 22, 2025 3:26 pmУ меня "временное решение" для FindReplaceFiles.js с новой версией Scripts-плагина не работает - та же ошибка "Недостаточно места в стеке" на строке 663.
Выложите/вышлите папку с AkelPad'ом.

Добавлено
Внёс дополнительные правки.

Offline
Posts: 3248
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: Scripts discussion (4)

Post by VladSh »

Instructor
Последние изменения работают. Спасибо!

P.S. Только что 11-я винда обновилась до сборки 26100.7171, с пакетом интерфейса компонентов 1000.26100.265.0, и на ней старый код всё ещё не работает. Проверил, т.к. надеялся, что м.б. исправили, но - нет...

Offline
Posts: 9
Joined: Tue Feb 03, 2026 1:20 pm

Re: AkelPad и другие приложения

Post by testuser2 »

Instructor, спасибо за ответы, у меня такая проблема возникла. Я сделал резидентный скрипт, который следит за вводом и выравнивает пробелы во вводимом и вставляемом коде и он работает нормально. Но, если во время выполнения скрипта я хучу убавить табуляцию (Shift + Tab) у какого-то блока текста, то прога падает с ошибкой. На Shift + Tab у меня назначен свой скрипт. В обоих скриптах прописан AkelPad.ScriptNoMutex, но это не помагает. Получается, что где-то возникает конфликт двух скриптов, вносящих изменения. Вопрос, как можно это разрулить, т.е. в скрипте перед любым внесением изменений нужно, наверное делать какую-то проверку или пропуск событий?

Offline
Posts: 9
Joined: Tue Feb 03, 2026 1:20 pm

Re: AkelPad и другие приложения

Post by testuser2 »

Выложил свои скрипты на гит. Немного переделал скрит для "shift + tab" и теперь прога не вылетает, если делать Shift + Tab аккуратней с небольшими паузами, но если делать очень быстро, можно нарваться на краш.

Offline
Posts: 9
Joined: Tue Feb 03, 2026 1:20 pm

Re: Scripts discussion (4)

Post by testuser2 »

Все, я вроде понял. Для Shift+Tab я переделал скрипт, вроде работает без сбоев, а вот для Tab, я не могу поменять действие, которое к нему привязано. Как я понимаю, скрипты, работающие синхронно не конфликтуют с ассинхронным резидентным скриптом. Но вот если в скрипте добавить ScriptNoMutex, то он уже конкурирует с другими NoMutex и это плохо. И, по видимому, стандартные фичи, тоже ассинхронные и они также конфликтуют с резидентным скриптом. Поэтму я решил сделать скрипт для действия Tab, но у меня не получилось поменять стандартное действие назначенное на клавишу Tab. Уважаемый Instructor, не подскажете, можно ли как-то это сделать?

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

Re: Scripts discussion (4)

Post by Instructor »

testuser2
JScriptCodeProcessing.js - вызывать AkelPad.ReplaceSel в оповещении AEN_TEXTINSERTEND не лучшая идея. Используйте AEN_TEXTCHANGED для этого. Возможно этого будет достаточно для исправления проблем.

Если понадобятся примеры по работе с синхронизацией (запускаем TestEvent1.js и сразу TestEvent2.js):

Code: Select all

var oSys=AkelPad.SystemFunction();
var hEvent;

AkelPad.ScriptNoMutex();

if (hEvent=oSys.Call("kernel32::CreateEvent" + _TCHAR, 0, 0, 0, "AkelPad::TestEvent"))
{
  if (oSys.GetLastError() != 183 /*ERROR_ALREADY_EXISTS*/)
  {
    //Do some work...
    WScript.Sleep(10000);
    oSys.Call("kernel32::SetEvent", hEvent);
  }
  oSys.Call("kernel32::CloseHandle", hEvent);
}


Code: Select all

var oSys=AkelPad.SystemFunction();
var hEvent;

if (hEvent=oSys.Call("kernel32::OpenEvent" + _TCHAR, 0x1F0003 /*EVENT_ALL_ACCESS*/, false, "AkelPad::TestEvent"))
{
  oSys.Call("kernel32::WaitForSingleObject", hEvent, -1 /*INFINITE*/);
  //Work in first script is finished

  oSys.Call("kernel32::SetEvent", hEvent);
  oSys.Call("kernel32::CloseHandle", hEvent);
}

WScript.Echo("I'm the only one");

Offline
Posts: 9
Joined: Tue Feb 03, 2026 1:20 pm

Re: Scripts discussion (4)

Post by testuser2 »

Instructor wrote: Wed Mar 04, 2026 8:32 pm JScriptCodeProcessing.js - вызывать AkelPad.ReplaceSel в оповещении AEN_TEXTINSERTEND не лучшая идея. Используйте AEN_TEXTCHANGED для этого. Возможно этого будет достаточно для исправления проблем.
К сожалению не помогает, но я думаю, поступить по иному, просто обходить в своем обработчике все изменения, произошедшие после Tab/Shift+Tab. Спс за пример с апишными эвентами, буду знать как их сдесь использовать.

Offline
Posts: 9
Joined: Tue Feb 03, 2026 1:20 pm

Re: Scripts discussion (4)

Post by testuser2 »

Все нашел лекарство

Code: Select all

function OnSelChanging(lParam){
    /*PrintLog("Начало выделения");*/
    if (oSys.Call("user32::GetAsyncKeyState", 9)) 
        if (!IsTabPressed) IsTabPressed = true
    else
        if (IsTabPressed) IsTabPressed = false
}
А в событии AEN_TEXTCHANGED

Code: Select all

function OnTextChanged(lParam){
    //PrintLog("После изменения \n\n")
    if (IsTabPressed) {
       IsTabPressed = false
       return
    }
    ***
И все работает без сбоев!
Post Reply