ApceH

|
Posted: Wed Apr 20, 2011 19:05 Post subject: |
|
|
Total7zip
Я так понял, что прога сработает только если родитель — totalcmd? И только на него влияет?
Известно, что в XP нет "официальной" папки Загрузки... Но оставлять не на всех ОС работающую кнопку на панели не хорошо! Тем более что у многих пользователей XP имеется такая папка, куда они обычно загружают всё с инета... Итак, что я задумал...
Приведу свой обновлённый скрипт для захода в папку из реестра:
Code: | /********************************************************************/
// Имя: GoToPathFromRegistry.js
// Автор: Шаповалов Арсений aka ApceH Hypocrite
// Описание: Переход TC в папку, путь которой получается из рестра по указанному ключу.
// Если ключ отсутствует (например, в устаревшей ОС), предлагается выбрать папку.
// Скрипт внесёт недостающий ключ.
/********************************************************************/
//Создаем объект ws
ws=WScript.CreateObject("WScript.Shell");
args=WScript.Arguments;
if (args.Count() < 2) {
ws.Popup("Скрипт предназначен для запуска с панели Total Commander!\n\nСкрипт ожидает 2 или 3 параметра:\n• название ключа реестра с полным путём,\n• название значения реестра\n• локализованное название папки\n\nВнимание!\n• Нужно заключать в кавычки параметры, содержащие пробелы.\n• Слеши в пути НЕ нужно дублировать (экранировать).\n• В конце пути слеша быть НЕ должно.",0,"Неправильное использование",16);
WScript.Quit(1);
}
KeyPath=args(0);
ValueName=args(1);
FolderName=(args.Length>=3)?" \""+args(2)+"\"":", которая должна была открыться";
//Читаем значение из реестра
try{
Value=ws.RegRead(KeyPath+"\\"+ValueName);
}
catch(e){
//ключ не найден
ShellApp=WScript.CreateObject("Shell.Application");
FolderDlg=ShellApp.BrowseForFolder(0, "Требуемый ключ реестра не найден!\nУкажите папку"+FolderName+",\nчтобы добавить недостающий ключ.", 0x11);
//
if (FolderDlg) {
Value=FolderDlg.Items().Item().Path;
ws.RegWrite(KeyPath+"\\"+ValueName, Value);
}
else WScript.Quit(2);
}
//==============
//вместо этого костыля хотелось бы запустить TCShellCD.exe...
//но его родителем будет wscript, поэтому он не сработает(((
//Создаём объект буфера обмена
try{
clip=new ActiveXObject("ClipboardHelper.Clipboard");
}
catch(e){
ws.Popup("Необходимая библиотека ClipboardHelper.dll не зарегистрирована!\nДля регистрации выполните от имен Администратора скрипт SystemRegister.cmd,\n находящийся в папке !Staging в месте, куда установлен kIT PPP.",0,"Неправильное использование",16)
WScript.Quit(3);
}
try{
//Получаем текущее содержимое буфера
temp=clip.GetClipboardText();
//Заносим в буфер обмена команду
clip.SetClipboardText("cd "+Value);
//"Вводим" в TC
ws.SendKeys("{RIGHT}");
ws.SendKeys("^a");
ws.SendKeys("^v");
WScript.Sleep(100);
ws.SendKeys("{ENTER}");
//Надо подождать, потому что может вставить возвращенный старый текст!
WScript.Sleep(1000);
//Возвращаем текст как было
clip.SetClipboardText(temp);
}
catch(e) {}
/************* Конец ************************************************/ |
Кнопка примерно такая: Code: | TOTALCMD#BAR#DATA
wscript %COMMANDER_PATH%\ADDONS\GoToPathFromRegistry.js
"HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" {374DE290-123F-4565-9164-39C4925E467B}
ICONS\downloads.ico
Перейти в папку "Загрузки"
%COMMANDER_PATH%\ADDONS\
1
-1
|
То есть я хочу, чтобы если человек нажал кнопку под устаревшей ОС, его попросили самому выбрать папку, которую он использует для "загрузок"...
Указанная папка прописывается в реестр и далее человек как-будто сидит под современной ОС!
Всё бы хорошо, но вместо шаманства с буфером обмена и посылкой нажатий клавиш, я не смог использовать вашу прогу TCShellCD, потому что её родителем становится wscript (или даже просто система, если он успевает завершится)... Я не смог найти, как сменить родителя процесса в WSH, да и это будет не менее идиотский костыль...
Таким образом, очень надеюсь, что вы реализуете в самой проге такой функционал:
если такого ключа нет (но синтаксически всё в порядке),
запросить указать папку
и записать её путь в переданный ключ реестра,
а затем перейти в эту папку, обычным способом (а в дальнейшем ключ уже будет существовать).
Ну конечно, если нажал Отмена, то ключ не создаём и в папку не входим. |
|