Что нового

[Реестр] Менеджер контекстного меню

Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Skif_off
Это не ошибки, а сообщения пользователю, что данный подраздел реестра у него отсутствует.
AllFilesystemObjects\shell у многих или пустой или отсутствует напрочь(обычно первое). Это нормально. Лично я его обычно сразу после установки windows заполнял полезняшками - через reg файлы. dllfile\shell - тоже самое - его просто у тебя нет. Чтобы программа могла работать с этими объектами - подраздел shell нужно создать вручную. Я посчитал, что если в реестре по каким то причинам отсутствует подраздел shell у какого то объекта, то программа не должна его создавать, а просто сообщить пользователю.


Добавлено:
Сообщение автоматически объединено:

Впрочем, можно, конечно добавить к сообщению запрос на создание - и кнопки ОК и Отмена.
Я как то об этом сразу не подумал - тем более, что на моей Windows все эти подразделы существуют. А на Windows 8 AllFilesystemObjects\shell создан изначально системой.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
заметил, что при добавлении пунктов "переместить в папку" и "копировать в папку" пункты в конменю добавляются, но в программе не отображаются
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
joiner
А я об этом в справке написал :smile: Так и должно быть - программа не отслеживает обработчики контекстного меню из ContextMenuHandlers. Добавлять добавляет - три штуки, но не более того.
----------------------------------
Залил новый вариант - для удобства пользователя при отсутствии у объекта стандартного ключа shell программа предлагает его создать, после чего становится возможно добавлять в него пункты меню.


Добавлено:
Сообщение автоматически объединено:

Не знаю как на 64-битной семерке, на 64-битной восьмерке отсутствуют 32-битные версии следующих приложений: memtest, SoundRecorder.exe, StikyNot.exe, SnippingTool.exe, rstrui.exe(восстановление системы),CompMgmtLauncher.exe (управление компьютером) и напрочь отсутствует recdisc.exe (средство cоздания диска восстановления).
Поэтому иконки этих приложений в списках программы не отображаются. GUICtrlSetImage видимо не может 'забрать' иконку у данных приложений, так как работает в 32-битной версии.
Но в системе разумеется все иконки отображаться будут. Диалог выбора иконки для этих приложений также выдаст ошибку, что файл не найден и ничего не отобразит.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Обновил до версии 1.2. Есть одно критическое и пара мелких исправлений.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Обновил до версии 1.3.
Исправлены некоторые некритичные ошибки.
Добавлено:
1) возможность открывать в реестре ключи в CommandStore для подпунктов каскадного меню;
2) отключение файлового редиректа для диалога выбора иконок (актуально для для 64-битных систем): теперь Диалог выбора иконок больше не ругается на отсутствие файла, если в системе нет его 32-битной копии;
3) новые предопределенные команды (больше 20)
PS: Для команд Показать\Скрыть скрытые файлы и Показать\Скрыть системные файлы нужно скопировать файлы showsuperhidden.js и showhidden.js в папку c:\windows.
-------------------------------------------------------------------
Убедился, наконец то на собственном опыте, что для диалога выбора файлов отключение редиректа по каким то странным причинам не работает... Так что на 64-битных системах проводник хотя и будет показывать, что мы в папке system32 (при выборе файлов), но на самом деле отображать содержимое SysWOW64.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
erlik [?]
Для команд Показать\Скрыть скрытые файлы и Показать\Скрыть системные файлы нужно скопировать файлы showsuperhidden.js и showhidden.js в папку c:\windows.
У меня на Windows 7x86 для включения, например, опции "Показывать скрытые файлы, папки и диски" работает такой код.
Код:
Local $s_RegKey = 'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', $s_RegName = 'Hidden'

If RegRead($s_RegKey, $s_RegName) <> 1 Then
	RegWrite($s_RegKey, $s_RegName, 'REG_DWORD', 1)
	_UpdateExplorer()
EndIf

Func _UpdateExplorer()
;~ Yashied; http://autoit-script.ru/index.php/topic,327.0.html
	Local $Opt = Opt('WinSearchChildren', 1)
	Local $List = WinList('[CLASS:SHELLDLL_DefView]')

	For $i = 1 To UBound($List) - 1
		DllCall('user32.dll', 'long', 'SendMessage', 'hwnd', $List[$i][1], 'int', 0x0111, 'int', 0x7103, 'int', 0)
	Next
	Opt('WinSearchChildren', $Opt)
EndFunc   ;==>_UpdateExplorer
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
madmasles
Так у меня Jscript используется просто потому, что в качестве команды контестного меню пишется 'wscript.exe c:\windows\showsuperhidden.js'. То есть этот файл на клик меню выполняется. (Wscript он же встроен в ОС - ничего доустанавливать не нужно).
Пробовал делать команду с динамическим созданием скрипта: cmd /c ...код по созданию jscript'а и последующего запуска ...., но все портило появление окна cmd. Поэтому сделал вариант с готовыми файлами. Для обновления окна проводника там клик по F5 используется.
---------------------------------------------------------------------------

Обновил программу до версии 1.4. Имеются важные исправления.
 
Автор
E

erlik

Продвинутый
Сообщения
317
Репутация
84
Немного выше я указывал, что для диалога выбора файлов отключение редиректа на 64-битных системах не работает (если у кого то получилось это сделать - напишите). Не знаю интересно это кому то, но выяснилось, что (пока) единственный (для AutoIt приложений) способ 32-битному приложению попасть в папку system32 (64-бит) через диалог открытия файла это использование специального псевдонима Sysnative. Вот так оно работает:
Код:
;$iWOW64 сюда пишется результат проверки запущен ли процесс под WOW64
$sFileSelect =_WinAPI_OpenFileDlg("Выбор файла...", @WindowsDir & _IIf($iWOW64,'\Sysnative','\System32'), "Executable Files (*.exe)|Applets Files (*.cpl)|All Files (*.*)", 1, "", "",0, 0, 0, 0, $hMainWnd)

Минус в том, что путь (как видно из скриншота) отображается как C:\Windows\Sysnative и это может запутать неискушенного пользователя, да и в строке возврата нужно заменять подстроку Sysnative на System32.
PS: Пока вот думаю, вставлять ли этот костыль в программу...
 
Верх