Page 8 of 96

Posted: Tue Nov 01, 2011 6:53 pm
by KDJ
opk44
WshShell.SendKeys("^r");

Posted: Wed Nov 02, 2011 6:27 am
by Andrey_A_A
opk44
Создай файл SendKeys.vbs

Code: Select all

' Посылает одно или несколько нажатий клавиш
' в параметрах строка выполнения нажатий
CreateObject("WScript.Shell").SendKeys WScript.Arguments(0)
и вызывай любые клавиатурные сочетания

-"Перейти на страницу вверх Page UP" Call("Scripts::Main", 1, "SendKeys.vbs", `"{PGUP}"`)
-"Ctrl +R" Call("Scripts::Main", 1, "SendKeys.vbs", `"^R"`)

Posted: Wed Nov 02, 2011 10:03 am
by opk44
1. KDJ
Thank you! Very helpful and simple!

2.
FeyFre wrote:opk44, не страдать фигней, и вызвать диалог коммандой AkelPAd.Command()
Наверное, чтобы не провоцировать такой реакции, следовало сразу объяснить свою мотивацию. Целью было написать скрипт, преобразующий макросы в скрипты (получить этакие легко редактируемые "псевдо-макросы"). Самым очевидным решением ("в лоб") представлялось перевести байт-последовательности в соответствующие им вызовы SendKeys.

3. Andrey_A_A
Спасибо за предложение. Возьму на заметку.

4. На текущий момент есть некий "прототип" скрипта по преобразованию макросов в заготовки скриптов. Он очень сырой и многого "не умеет" (например не отлавливает переключение раскладки), но благодаря подсказке KDJ делает теперь "хоть что-то".
Например: [more="результат разбора макроса объединения строк от Surveyor = "Join selected lines.macro" (см. "Plugins-Eng.chm")"]

Code: Select all

C:\Program Files\Total Commander\Plugins\exe\AkelFiles\Plugs\Macros\Join selected lines.macro
Size: 432 bytes (54 keys)
----------------------------------------
VBScript template
----------------------------------------
Dim WshShell
  Set WshShell = CreateObject("WScript.Shell")
  WshShell.SendKeys "^r"
  WshShell.SendKeys ""
  WshShell.SendKeys "n"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys " "
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "-"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "-"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "{+}"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "{UP}"
  WshShell.SendKeys "{UP}"
  WshShell.SendKeys "{UP}"
  WshShell.SendKeys "{UP}"
  WshShell.SendKeys "{DOWN}"
  WshShell.SendKeys "{DOWN}"
  WshShell.SendKeys "{DOWN}"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "{TAB}"
  WshShell.SendKeys "{ENTER}"
  WshShell.SendKeys "{ENTER}"
  WshShell.SendKeys "{ESC}"
  WshShell.SendKeys "{HOME}"
----------------------------------------
JScript template
----------------------------------------
  var WshShell = new ActiveXObject("WScript.Shell");
  WshShell.SendKeys ("^r");
  WshShell.SendKeys ("");
  WshShell.SendKeys ("n");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys (" ");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("-");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("-");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("{+}");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("{UP}");
  WshShell.SendKeys ("{UP}");
  WshShell.SendKeys ("{UP}");
  WshShell.SendKeys ("{UP}");
  WshShell.SendKeys ("{DOWN}");
  WshShell.SendKeys ("{DOWN}");
  WshShell.SendKeys ("{DOWN}");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("{TAB}");
  WshShell.SendKeys ("{ENTER}");
  WshShell.SendKeys ("{ENTER}");
  WshShell.SendKeys ("{ESC}");
  WshShell.SendKeys ("{HOME}");
----------------------------------------

примеч.: для получения работоспособного кода в JS из шаблона нужна еще дополнительная коррекция слешей (замена "" на "\")

5. Будь это еще кому-то интересно... Пока скрипт не достаточно оттестирован для выкладывания в соседней теме.

Posted: Thu Nov 03, 2011 9:31 pm
by Andrey_A_A
в скрипте CloseUnnamedAll.js есть глюк
Если запустить его, когда открыт безымянным документ
Получается вечно переходящий с вкладки на вкладку Akel
Прикольный эффект, но лучше его поправить :)

Posted: Fri Nov 04, 2011 9:15 am
by Instructor
Andrey_A_A
Поправил.

Posted: Fri Nov 04, 2011 11:56 am
by Andrey_A_A
Instructor
Спасибо, теперь работает отлично!

Posted: Wed Nov 09, 2011 11:42 am
by Andrey_A_A
Instructor
можно ещё попросить, сделать параметр в CloseUnnamedAll.js
чтобы вкладки тех документов, которых невозможно открыть тоже закрывались без запросов
Поясняю, у меня частенько бывает: просматриваешь документы в AkelPad'e, а массово перемещаешь, удаляешь, переименовываешь их через тотал.
В AkelPad'e остаются их вкладки, хотелось бы без запросов их все закрыть, а вкладки существующих документов оставить

В итоге чтобы все безымянные и не существующие вкладки закрывались

Posted: Fri Nov 11, 2011 10:54 am
by opk44
Добавлен скрипт для преобразования макросов в последовательность вызовов SendKeys(). Генерируется шаблонный код VBS и JS.
Ряд ограничений побороть пока не удалось, но совпадение достаточно высокое.
В ряде случаев даже возможно непосредственное использование кода :).
(записанный макрос редактировать практически невозможно, а скрипт-то запросто!)
И все же основным назначением предполагается выяснение "что именно делал/делает тот или иной макрос". Потому что забывается...
Macro2SendKeys.vbs

Posted: Sat Nov 12, 2011 3:05 am
by Andrey_A_A
Хотелось бы маленькую штучку для безопасности документов

Скрипт SearchReplace.js и команда 4161 имеют функцию "Все файлы"
Хотелось бы при нажатии на кнопку "Заменить всё", чтобы вылетало окно с дополнительным вопросом "Вы действительно хотите это сделать для всех документов"

Для меня эта функция не на каждый день, но использовав её можно забыть убрать "галочку", и при использовании в следующий раз нажимая "Заменить всё", можно забыть, что будет произведена замена во всех документах. Что как раз и произошло со мной: В 70 документах произошли изменения - проглядел галку "все файлы".

Posted: Sun Nov 13, 2011 1:26 pm
by KDJ
On msdn it is written:
"StreamSize (8 bytes): A 64-bit signed integer that contains the size, in bytes, of the stream.
The value of this field MUST be greater than or equal to 0x0000000000000000."
( http://msdn.microsoft.com/en-us/library ... 13%29.aspx )

To read 64-bit integer from the memory on 32-bit system, it is possible to do this way:

Code: Select all

var sNum = "";
var nNum, sByte, i;
for (i = 0; i < 8; ++i)
{
  sByte = AkelPad.MemRead(lpBuffer + i, 5 /*DT_BYTE*/).toString(16);
  if (sByte.length == 1) sByte = "0" + sByte;
  sNum = sByte + sNum;
}
nNum = parseInt("0x" + sNum);
Question: is the simpler method?

Posted: Sun Nov 13, 2011 1:39 pm
by Instructor
Andrey_A_A wrote:В итоге чтобы все безымянные и не существующие вкладки закрывались
CloseUnnamedAll.js

Posted: Sun Nov 13, 2011 4:11 pm
by Andrey_A_A
Instructor, спасибо, вкладки закрываются, но когда дело доходит до "несуществующей", всё равно остаётся запрос:
"Невозможно открыть файл". Когда кучу таких вкладок...

-"Оставить реальные вкладки" Call("Scripts::Main", 1, "CloseUnnamedAll.js", `-CloseUnnamed=true -CloseUnexisted=true`)

Posted: Mon Nov 14, 2011 5:16 pm
by FeyFre
FileStreams_functions.js
KDJ, on _WIN32_WINNT >= 0x0600 (Vista/2008/2008R2/7/8) and in 2003 there are a documented API calls which allows to enumerate streams: FindFirstStreamW, FindNextStreamW, and WIN32_FIND_STREAM_DATA structure. Your function should use them when possible.

Posted: Mon Nov 14, 2011 6:29 pm
by KDJ
FeyFre
Yes, that's right.
And even functions FindFirstStreamW/FindNextStreamW are simpler to use than NtQueryInformationFile.
But unfortunately there are no these functions in Win-XP.
NtQueryInformationFile should work on Win-XP and on Win-7.

Posted: Mon Nov 14, 2011 6:44 pm
by FeyFre
KDJ, then use them conditionally. You always can get version of windows in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion key(REGSZ). For 2003 there will be 5.2, for 2008/Vista/7/8 number will be 6.x. But most correct way to find OS version is to use GetVersionEx API call MSDN