Page 1 of 99

Scripts discussion (3)

Posted: Thu Apr 17, 2014 6:44 am
by Instructor
RUS: Обсуждение скриптов.

ENG: Scripts discussion.


Scripts discussion (1) 07.07.2007 - 08.09.2011
Scripts discussion (2) 08.09.2011 - 17.04.2014
Scripts discussion (3)

Posted: Thu Apr 17, 2014 8:36 am
by Infocatcher
(из предыдущей части)
Instructor wrote:viewtopic.php?p=17567#p17567

См. пример GetHex в HexSel-Rus.txt.
Дело в том, что нужен не сам HexSel, а сохранение и восстановление выделения (конкретно вот тут).

Posted: Thu Apr 17, 2014 8:52 am
by Infocatcher
Нужно вывести некий прогресс, хотелось использовать для этого заголовок окна (как самый простой вариант), но как при этом потом восстановить оригинальный заголовок в MDI-режиме?
Проблема в том, что user32::GetWindowTextW() возвращает реальный заголовок, а если потом выставить полученное через user32::SetWindowTextW(), то изменяемая часть заголовка будет прибавляться в конец добавленного (и будет двоиться). Если при восстановлении вписать «AkelPad», то работает корректно, но вот как получить эту базовую часть программно?

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var orig = windowText(hMainWnd);
windowText(hMainWnd, "Test message");
WScript.Sleep(500);
windowText(hMainWnd, orig);

function windowText(hWnd, pText) {
	if(arguments.length > 1)
		return oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
	var len = oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWnd);
	var lpText = AkelPad.MemAlloc((len + 1)*_TSIZE);
	if(!lpText)
		return "";
	oSys.Call("user32::GetWindowText" + _TCHAR, hWnd, lpText, len + 1);
	pText = AkelPad.MemRead(lpText, _TSTR);
	AkelPad.MemFree(lpText);
	return pText;
}

Posted: Thu Apr 17, 2014 6:14 pm
by KDJ
Infocatcher

Code: Select all

if (AkelPad.IsMDI() == 1 /*WMD_MDI*/)
{
  var oSys      = AkelPad.SystemFunction();
  var hMainWnd  = AkelPad.GetMainWnd();
  var hWndFrame = AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 1 /*FI_WNDEDITPARENT*/, 0 /*current frame*/);
  var sMainTitle;
  var sFrameTitle;
  var sFullTitle;
  var sMainTitleNew;
  var sFrameTitleNew;
  var sFullTitleNew;

  //get original title
  sFrameTitle = windowText(hWndFrame);
  sFullTitle  = windowText(hMainWnd);
  windowText(hWndFrame, "");
  sMainTitle = windowText(hMainWnd);
  windowText(hWndFrame, sFrameTitle);
  WScript.Echo("Main title part:\t" + sMainTitle + "\n" + "Frame title:\t" + sFrameTitle + "\n" + "Main title full:\t" + sFullTitle);

  //set new title
  windowText(hMainWnd, "New main title");
  windowText(hWndFrame, "New frame title");
  //get new title
  sFrameTitleNew = windowText(hWndFrame);
  sFullTitleNew  = windowText(hMainWnd);
  windowText(hWndFrame, "");
  sMainTitleNew = windowText(hMainWnd);
  windowText(hWndFrame, sFrameTitleNew);
  WScript.Echo("Main title part:\t" + sMainTitleNew + "\n" + "Frame title:\t" + sFrameTitleNew + "\n" + "Main title full:\t" + sFullTitleNew);

  //restore original title
  windowText(hMainWnd, sMainTitle);
  windowText(hWndFrame, sFrameTitle);
  sFrameTitle = windowText(hWndFrame);
  sFullTitle  = windowText(hMainWnd);
  windowText(hWndFrame, "");
  sMainTitle = windowText(hMainWnd);
  windowText(hWndFrame, sFrameTitle);
  WScript.Echo("Main title part:\t" + sMainTitle + "\n" + "Frame title:\t" + sFrameTitle + "\n" + "Main title full:\t" + sFullTitle);
}

function windowText(hWnd, pText) {
   if(arguments.length > 1)
      return oSys.Call("user32::SetWindowText" + _TCHAR, hWnd, pText);
   var len = oSys.Call("user32::GetWindowTextLength" + _TCHAR, hWnd);
   var lpText = AkelPad.MemAlloc((len + 1)*_TSIZE);
   if(!lpText)
      return "";
   oSys.Call("user32::GetWindowText" + _TCHAR, hWnd, lpText, len + 1);
   pText = AkelPad.MemRead(lpText, _TSTR);
   AkelPad.MemFree(lpText);
   return pText;
}

Posted: Thu Apr 17, 2014 7:17 pm
by Infocatcher
KDJ
Thanks! Still looks tricky, but works fine. :)

https://github.com/Infocatcher/AkelPad_ ... c733b2bec8
Yet another paranoid iteration for 2 years old prototype: commits/master/cryptExt.js (just thanks to Heartbleed :?).
But unfortunately PBKDF2 is slow by design and especially slow in JScript implementation.

Posted: Thu Apr 17, 2014 8:52 pm
by KDJ
Infocatcher
I forgot to write that this trick should be used only if frame window is maximized (oSys.Call("User32::IsZoomed", hWndFrame)).
viewtopic.php?p=22843

Posted: Fri Apr 18, 2014 5:33 am
by Infocatcher
KDJ wrote:I forgot to write that this trick should be used only if frame window is maximized (oSys.Call("User32::IsZoomed", hWndFrame)).
Oh, I see. Thanks again, corrected.

Posted: Fri Apr 18, 2014 12:24 pm
by [Yustas.NeO]
Похоже, что в какой-то из последних версий «Scripts.dll» перестал запускаться скрипт SetCoderExt.js. Вернее он запускается и тут же завершается.
Подскажите, пожалуйста, что в нем необходимо изменить?

Posted: Fri Apr 18, 2014 1:16 pm
by FeyFre
Instructor wrote:FeyFre
History.js. Запускаю скрипт из диалога Scripts, мелькает окошко и тут же исчезает. При удалении History.ini результат тот же. WinXP x86.
KDJ wrote:Instructor
FileAndStream.js and Translator.js does not work.
It seems to me that a bug is in AkelPad.WindowSubClass() method.
[Yustas.NeO] wrote:Похоже, что в какой-то из последних версий «Scripts.dll» перестал запускаться скрипт SetCoderExt.js. Вернее он запускается и тут же завершается.
Подскажите, пожалуйста, что в нем необходимо изменить?
Это к Инструктору :) Товарищ KDJ довольно точно определил место бага. AkelPad.WindowSubClass() больше не сабкласит главное окно АР если ей передали её главный хендл. Если передают псевдохендл(1), то да работает. Когда отвалилось не знаю, похоже в районе v13.4 - там описывался фикс сабкласинга.

[Yustas.NeO]

Найти

Code: Select all

if(AkelPad.WindowSubClass(g_hAkelPad, AkelPadCallBack))
заменить на

Code: Select all

if(AkelPad.WindowSubClass( 1 , AkelPadCallBack))

Posted: Fri Apr 18, 2014 1:33 pm
by Instructor
Infocatcher wrote:Дело в том, что нужен не сам HexSel, а сохранение и восстановление выделения (конкретно вот тут).
Это можно в RenameFile.js посмотреть.

FeyFre
Методу WindowSubClass нельзя передавать дескриптор главного окна - он вернет 0. Необходимо в скриптах вместо дескриптора использовать WindowSubClass(1 /*WSC_MAINPROC*/...).

Posted: Fri Apr 18, 2014 1:35 pm
by [Yustas.NeO]
FeyFre wrote:заменить на

Code: Select all

if(AkelPad.WindowSubClass( 1 , AkelPadCallBack))
Да, спасибо, помогло!

Posted: Fri Apr 18, 2014 2:51 pm
by FeyFre
Instructor, а хендл окна редактирования тоже нельзя?

Posted: Fri Apr 18, 2014 3:26 pm
by Instructor
FeyFre
Указанное выше касается только главного окна. "WindowSubClass(2 /*WSC_EDITPROC*/...)" устанавливается для всех окон редактирования, "WindowSubClass(hWndEdit...)" для одного окна.

Posted: Sat Apr 19, 2014 6:19 pm
by FeyFre
Обновлены скрипты
SetCoderExt.js
History,js

Instructor, а какже совместимость назад? Вот 2 скрипта на пустом месте отвалилось, а ведь внутри можно было бы и проверить хендел, вместо того что-бы в скрипте каждый городил.

Я так понимаю WindowUnsubClass это тоже касается?

Я бы с удовольствие пользовался 1 и 2 и 3, если бы они были собственно именованными константами а не просто магическими числами. До-определять их в каждом скрипте тоже извиняюсь не формат.

Posted: Sun Apr 20, 2014 5:20 pm
by Infocatcher