Scripts discussion (3)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Scripts discussion (3)

Post 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)
Last edited by Instructor on Mon Oct 17, 2016 3:46 pm, edited 1 time in total.

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

Post by Infocatcher »

(из предыдущей части)
Instructor wrote:viewtopic.php?p=17567#p17567

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

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

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

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

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

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

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

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

Post 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

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

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

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

Похоже, что в какой-то из последних версий «Scripts.dll» перестал запускаться скрипт SetCoderExt.js. Вернее он запускается и тут же завершается.
Подскажите, пожалуйста, что в нем необходимо изменить?

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

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

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

Post by Instructor »

Infocatcher wrote:Дело в том, что нужен не сам HexSel, а сохранение и восстановление выделения (конкретно вот тут).
Это можно в RenameFile.js посмотреть.

FeyFre
Методу WindowSubClass нельзя передавать дескриптор главного окна - он вернет 0. Необходимо в скриптах вместо дескриптора использовать WindowSubClass(1 /*WSC_MAINPROC*/...).
Last edited by Instructor on Fri Apr 18, 2014 1:36 pm, edited 1 time in total.

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

Post by [Yustas.NeO] »

FeyFre wrote:заменить на

Code: Select all

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

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

Post by FeyFre »

Instructor, а хендл окна редактирования тоже нельзя?

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

Post by Instructor »

FeyFre
Указанное выше касается только главного окна. "WindowSubClass(2 /*WSC_EDITPROC*/...)" устанавливается для всех окон редактирования, "WindowSubClass(hWndEdit...)" для одного окна.

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

Post by FeyFre »

Обновлены скрипты
SetCoderExt.js
History,js

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

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

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

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

Post by Infocatcher »

Locked