Создание каскадного меню [утилита Cascade Menu Creator]

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Оно ж у тебя все в скобках.
В скобках ты и присваиваешь, а значит в них же ты новое значение можешь получить только через !onepunkt1!
не забыв объявить директивой SetLocal EnableDelayedExpansionПри этом знаки ! в именах использовать не сможешь.

Или думай как избавится от скобок.
Можно конечно сделать вот так:

Код:
call echo.>>"%~dp0ttools\UserReg\%%onepunkt1%%.reg"
Но это тебе почти во всех строках придется так прописывать call и двойные %%.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
решил reg query вызывать через call
CMD/BATCH:
:onepunkt1
 call :queryonepunkt1

echo Пункт №1
echo.
set /p name_onepunkt1="Ведите имя пункта меню и нажмите клавишу Enter: "

echo Введено "%name_onepunkt1%"
pause
copy "%~dp0ttools\ishodnik\reg.reg" "%~dp0ttools\UserReg\%onepunkt1%.reg"
echo Windows Registry Editor Version 5.00 >"%~dp0ttools\UserReg\%onepunkt1%.reg"
echo.>>"%~dp0ttools\UserReg\%onepunkt1%.reg"
echo ^[^HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\%onepunkt1%]>>"%~dp0ttools\UserReg\%onepunkt1%.reg"
reg import "%~dp0ttools\UserReg\%onepunkt1%.reg"
reg add "%key2%\%onepunkt1%" /ve /d "%name_onepunkt1%" /f  
reg add "%key2%\%onepunkt1%" /v "Icon" /t REG_SZ /d "imageres.dll,104" /f 
reg add "%key1%\%name%" /v "SubCommands" /d "%onepunkt1%;AddLog;prochee" /f 

 echo @echo off >"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo set txt_file="%~dp0ttools\UserTxt\%onepunkt1%.txt" >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo if not exist %%txt_file%% goto _error  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo :_clip  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo "%%SystemRoot%%\System32\clip.exe" ^<^ %%txt_file%%  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo exit  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo :_error  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo echo %%txt_file%% - file not found  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo pause  >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 echo exit /B >>"%~dp0ttools\UserBat\%onepunkt1%.bat"
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
В принципе алгоритм додумал,макет корявенький даже работает.

У меня некоторая сложность:
CMD/BATCH:
echo Раздел %name% уже существует,перезаписать его или отменить операцию?
Как мне прочитать и вывести в переменную имя параметра (MUIVerb или по умолчанию) ?

reg query тут опять по ходу в помощь,может есть какие то удобные решения а то я велосипед опять пойду изобретать)
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
имя параметра (MUIVerb или по умолчанию) ?
Значение параметра?

Вот проверенная временем функция.
Ограничение: неправильно читает параметры, в имени которых есть пробел.
Код:
@echo off
SetLocal EnableExtensions

call :Reg_Read "HKCU\Environment" "TEMP" "Data" "Type"

echo TEMP=%Data%. Тип данных: %Type%

pause & Exit /B

:Reg_Read
  :: %1-вх.Раздел
  :: %2-вх.Имя параметра
  :: %3-исх.Переменная для хранения значения
  :: %4-исх.(опционально)-Переменная для хранения типа параметра
  set "%~3="& if "%~4" neq "" set "%~4="
  For /f "tokens=2*" %%a In ('Reg.exe query "%~1" /v "%~2"') do (
    set "%~3=%%~b"& if "%~4" neq "" set "%~4=%%~a"
  )
Exit /B
Переходи уже на VBS. Такие сложные штуки не гоже на батниках писать.
Там хоть среда отладки какая-никакая есть. Редакторы.
В крайнем случае в Excel-е (VBA) можно отладить полноценно.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
На vbs пока ума не хватает... да,с пробелами беда,они будут однозначно как ты видел в прототипе.

Есть идея вывести через echo ,попробую.
Как вариант встроить команду с vbs?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Для пробелов я тоже писал функцию. Но она получилась очень большая ))

Как вариант встроить команду с vbs?
Можно. Но тогда давай в новой теме.
Еще ведь нужно предусмотреть варианты, что возвращать,
если не нашлось такого имени параметра, или если не хватило прав.
Какие операции еще нужны тебе кроме чтения.
На vbs пока ума не хватает
А что не так? Давай учится... на примере этой темы.
Тебе всего навсего нужно - работа с реестром (в полезных примерах все расписано),
работа с текстом, организовать меню.

Если честно, писать на батниках такую работу с вложенными разделами меня не радует.
Предыдущий опыт с контекстным меню получился не очень.У тебя ведь небольшой опыт на VB.NET был ?
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
Как вариант
CMD/BATCH:
@echo on
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\AddLog" /v MUIVerb >%~dp0j.txt
for /f scip 1 и т.д.
но кажется это галиматья.

У тебя ведь небольшой опыт на VB.NET был ?
да,был.
Пригодится?

Давай учится... на примере этой темы.
Давай!
Создать новую?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Понимаешь Кирилл, проблемы начинаются там,
где ты попытаешься этот же скрипт запустить и на XP, и на Win7,
а у них версии файла reg.exe сильно разнятся. Формат вывода другой.
А в CMD непросто работать со сложным парсингом строк.
Создать новую?
Давай. Буду объяснять все последовательно, но в одной теме обо всем.
Один вопрос: как сделать то-то. Аналог такой то команды? Один ответ...
Dragokas написал(а):
У тебя ведь небольшой опыт на VB.NET был ?
да,был.
Пригодится?
Нет. Не пригодится. Зачем нам груз в виде необходимости установки .Net Framework.
Просто есть много похожих методов и функций.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
ты попытаешься этот же скрипт запустить и на XP, и на Win7,
сейчас исключительно для ос старше виста,про хр отдельная песня по твикам.

Давай. Буду объяснять все последовательно, но в одной теме обо всем.
так и сделаю.
пока пауза - голова уже выкипела пока читал про vbs - освежал память.

в пятницу много времени планирую посвятить этому вопросу и практике,конечно,если у тебя будет возможность то здорово.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Ок. Тогда в раздел VBS. Это можно тоже изучать на практике.
В глубокую теоретику вдаваться по необходимости.
Там и расскажу. Постараюсь еще начальный материал дать вроде,
как понимать ошибки и как отлаживать (собственно CMD такими возможностями не похвастается).
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Вообщем решил, что сам напишу. Помогут.
Логику работы с реестром, конечно, серъезно надо продумать.
Псевдонимы пунктов меню в реестр записывать тупо транслитом?
А если русскими буквами - он поймет? А если еще и с пробелами?
 

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
Логику работы с реестром, конечно, серъезно надо продумать.
Псевдонимы пунктов меню в реестр записывать тупо транслитом?
А если русскими буквами - он поймет? А если еще и с пробелами?
Логика работы с реестром продумана.

Смотри:
Создаем родительский раздел
Код:
HKEY_CLASSES_ROOT\DesktopBackground\Shell\melpmemu
Далее (как ты наверняка помнишь из смежных тем) мы ограничены правилом 13 объектов.

Соответственно мы заранее должны определиться в количество двойных раскрывающихся меню.
Я исходил из оптимального на мой взгляд числа три.

Итого в трех двойных каскадных меню и одном классическом мы набираем 4 варианта с максимальным числом 13,умножаем и получаем 52 раздела в
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell
+ к ним еще 3 для папок двойных меню.

Итого 55 разделов,не считая основных (
Код:
HKEY_CLASSES_ROOT\DesktopBackground\Shell\melpmemu
)


Псевдонимы пунктов меню в реестр записывать тупо транслитом?
Отсюда следует что имеет смысл создать 4 набора псевдонимов (это если только для меню рабочего стола) с понятными для нас и программы логическими именами (на латинице!)

Например:
Код:
namemenu
ctxlink1
ctxlink2
...
ctxlink13

ctxnamemeu1

ctxmenu1link1
ctxmenu1link2
...
ctxmenu1link13

ctxnamemeu2

ctxmenu2link1
ctxmenu2link2
...
ctxmenu2link13


ctxnamemeu3

ctxmenu3link1
ctxmenu3link2
...
ctxmenu3link13
А для взаимодействия пользователя с объектами будем читать не имена разделов или параметров в реестре,а пользовательские имена из глаголов

Таким образом получаем осмысленную навигацию и надежный алгоритм.
Если не использовать заготовленные постоянные шаблоны разделов,то уже через месяц пользователь может нашлепать себе в реестр несколько тысяч разделов и само сабой с ошибочными записями или командами,которые разумеется чистить не будет.
И повалится на нас гнев народ за то ,что из за нашего твикера система лагает,тупит,проводник падает,ось вырубается...

В общем все неприятные лавры.

Поэтому я изначально и придерживался такого алгоритма.

+ есть возможность невероятно удобных двух кнопочек на нашем твикере:

1)возможность добавлять на только шаблоны для хэлперов,модеров и активных пользователей а еще непосредственно любые программы и скрипты по желанию юзера в два клика.
Потому что а) мы сможем прочитать и вывести в список все доступные имеющиеся меню компа б) за счет техники добавления шаблонов можно добавлять выполнение скриптов в) можно тупо через проводник указывать путь к программе,которую хочем добавить в меню

2)ровно по такому же принципу мы имеем возможность добавить кнопочку "удалить" в которой можно будет грохнуть не только наш пункт но и любой другой

3)опять из за вышеописанного мы сможем дать пользователю дать возможность настраивать общее контексное меню на его вкус)

Что скажешь?
Есть кому,да?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Демо.
Нажми правой кнопкой по форме.
 

Вложения

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
Ок,до компа доберусь испытаю.
Что насчет алгоритма скажешь?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
По-моему в условиях дикого ограничения числом 13 кнопки добавить-удалить - излишество,
которые только будут занимать место. Можно добавить по желанию пользователя в одно
из меню вызов этой утилиты настройки.
Думаю, этого будет достаточно.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,141
Реакции
5,916
Баллы
648
Весь исходник. На win8 не проверял.
Попробуй запустить из под IDE без компиляции.
Скажи на какой строке ошибка.
Есть вероятность, что среда может зависнуть. Будь аккуратен.
 

Вложения

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
Работает.
А если без ПКМ а сразу в меню?А я вот кнопку по координатам бегать заставил:
(пока одна для образца)
 

Вложения

  • 42.7 KB Просмотры: 5

Кирилл

Команда форума
Администратор
Сообщения
13,849
Реакции
6,188
Баллы
913
Так что решил с утилью?
 
Сверху Снизу