View previous topic :: View next topic |
Author |
Message |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 6250
|
Posted: Thu Apr 17, 2014 6:44 am Post subject: Scripts discussion (3) |
|
|
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 |
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Thu Apr 17, 2014 8:36 am Post subject: |
|
|
(из предыдущей части)
Дело в том, что нужен не сам HexSel, а сохранение и восстановление выделения (конкретно вот тут). |
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Thu Apr 17, 2014 8:52 am Post subject: |
|
|
Нужно вывести некий прогресс, хотелось использовать для этого заголовок окна (как самый простой вариант), но как при этом потом восстановить оригинальный заголовок в MDI-режиме?
Проблема в том, что user32::GetWindowTextW() возвращает реальный заголовок, а если потом выставить полученное через user32::SetWindowTextW(), то изменяемая часть заголовка будет прибавляться в конец добавленного (и будет двоиться). Если при восстановлении вписать «AkelPad», то работает корректно, но вот как получить эту базовую часть программно?
Демонстрация Code: | 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;
} |
|
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
Posted: Thu Apr 17, 2014 6:14 pm Post subject: |
|
|
Infocatcher
TitleMDI.js Code: | 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;
}
|
|
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Thu Apr 17, 2014 7:17 pm Post subject: |
|
|
KDJ
Thanks! Still looks tricky, but works fine.
>>> |
|
Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1929 Location: Poland
|
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
Posted: Fri Apr 18, 2014 5:33 am Post subject: |
|
|
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. |
|
Back to top |
|
 |
[Yustas.NeO]
Joined: 12 Mar 2007 Posts: 265
|
Posted: Fri Apr 18, 2014 12:24 pm Post subject: |
|
|
Похоже, что в какой-то из последних версий «Scripts.dll» перестал запускаться скрипт SetCoderExt.js. Вернее он запускается и тут же завершается.
Подскажите, пожалуйста, что в нем необходимо изменить? |
|
Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 2240 Location: Vinnitsa, Ukraine
|
Posted: Fri Apr 18, 2014 1:16 pm Post subject: |
|
|
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: | if(AkelPad.WindowSubClass(g_hAkelPad, AkelPadCallBack)) | заменить на Code: | if(AkelPad.WindowSubClass( 1 , AkelPadCallBack)) |
|
|
Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 6250
|
Posted: Fri Apr 18, 2014 1:33 pm Post subject: |
|
|
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 |
|
Back to top |
|
 |
[Yustas.NeO]
Joined: 12 Mar 2007 Posts: 265
|
Posted: Fri Apr 18, 2014 1:35 pm Post subject: |
|
|
FeyFre wrote: | заменить на Code: | if(AkelPad.WindowSubClass( 1 , AkelPadCallBack)) |
| Да, спасибо, помогло! |
|
Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 2240 Location: Vinnitsa, Ukraine
|
Posted: Fri Apr 18, 2014 2:51 pm Post subject: |
|
|
Instructor, а хендл окна редактирования тоже нельзя? |
|
Back to top |
|
 |
Instructor Site Admin
Joined: 06 Jul 2006 Posts: 6250
|
Posted: Fri Apr 18, 2014 3:26 pm Post subject: |
|
|
FeyFre
Указанное выше касается только главного окна. "WindowSubClass(2 /*WSC_EDITPROC*/...)" устанавливается для всех окон редактирования, "WindowSubClass(hWndEdit...)" для одного окна. |
|
Back to top |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 2240 Location: Vinnitsa, Ukraine
|
Posted: Sat Apr 19, 2014 6:19 pm Post subject: |
|
|
Обновлены скрипты
SetCoderExt.js
History,js
Instructor, а какже совместимость назад? Вот 2 скрипта на пустом месте отвалилось, а ведь внутри можно было бы и проверить хендел, вместо того что-бы в скрипте каждый городил.
Я так понимаю WindowUnsubClass это тоже касается?
Я бы с удовольствие пользовался 1 и 2 и 3, если бы они были собственно именованными константами а не просто магическими числами. До-определять их в каждом скрипте тоже извиняюсь не формат. |
|
Back to top |
|
 |
Infocatcher
Joined: 06 Aug 2007 Posts: 1767
|
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|