Мне нужен GUI интерфейс, примерно 640x480, для быстрого подключения/отключения нужных разделов логических дисков.
Почему хочется иметь самодельный "менеджер", ну потому-что с одной стороны чтобы ничего лишнего не было,
и в то же время может что-то полезное можно придумать. msc- консоли раздражают своими сайд-панелями, всякими табами ненужными.
Программы для hdd могут это делать, но грузятся дольше так как предназначены для более серьёзных задач.
Однако я не знаю как монтировать диски? Из windows знакомо лишь mountvol.exe. Если нету других возможностей, то это получиться
графическая оболочка для mountvol.exe. Прога вдобавок к дискам обращается как CLSID именам, с этим тоже не очень понятно как определиться.
Ещё знаю что всё это пишется в реестр в раздел HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices, но подробнее я тоже не знаю.
Для начала, я бы хотел только иметь окно где галочками можно было бы отключить(запретить), а потом включить по выбору логические диски.
Судя по всему прога(autoit) должна считать сначала все мои разделы и вывести мне их в окне...
?
speechless
10-09-2010, 00:00
как то давно делал для себя, посмотри
#include <GUIConstants.au3>
GUICreate("MoDev",400,130) ; will create a dialog box that when displayed is centered
GUISetState (@SW_SHOW) ; will display an empty dialog box
$regEnumVal = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", 1) ;читаем первое значение из реестра
if @error <> 0 then $regEnumVal="#"
GUICtrlCreateLabel ("Диск", 10, 17, 30)
GUICtrlCreateLabel ("Выбор иконки", 20, 90, 40,30)
GUICtrlCreateLabel ("Смонтировать", 90, 17, 75)
GUICtrlCreateLabel ("Отмонтировать", 87, 45, 80)
GUICtrlCreateLabel ("Поиск дисков", 90, 75, 75)
GUICtrlCreateGroup ("Бонус", 12, 33, 53, 90)
GUICtrlCreateLabel ( "MoDev паразитирует на стандартной виндозной утилите ""mountvol"" для монтирования/демонтирования разделов диска без перезагрузки ВНИМАНИЕ: при изменении размеров разделов повторите поиск дисков", 210,10, 180, 110)
$combo=GUICtrlCreateCombo ($regEnumVal, 45,10,35) ; создаем combo
ControlDisable("", "#", $combo) ;делаем серым combo
For $i = 1 to 100
$regEnumVal = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", $i) ;читаем в цикле реестр
if @error <> 0 Then ExitLoop
GUICtrlSetData($combo,$regEnumVal) ; добавляем в combo буквы fixed дисков
next
$deMount=GUICtrlCreateButton ("Демонтировать", 170, 40, 25,23,$BS_ICON) ;кнопка демонтировать
GUICtrlSetImage ($deMount,"shell32.dll",131,0)
$mount=GUICtrlCreateButton ("Монт", 170, 10, 25,23,$BS_ICON) ;кнопка монтировать
GUICtrlSetImage ($mount,"shell32.dll",112,0)
$search=GUICtrlCreateButton ("Поиск дисков", 170, 70, 25,23,$BS_ICON) ;кнопка поиска
GUICtrlSetImage ($search,"shell32.dll",22,0)
$ico=GUICtrlCreateButton ("Иконки", 20, 50, 37,35,$BS_ICON) ;кнопка выбора иконки
If GUICtrlRead($combo)="#" then ControlDisable("", "", $ico) ;если дисков нет кнопка $ico неактивна
$str = StringLeft(GUICtrlRead($combo), 1) ;берем только букву
$r=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\"&$str&"\DefaultIcon", "") ;читаем путь к иконке
GUICtrlSetImage ($ico,"shell32.dll",8) ;показ иконки на кнопке по умолчанию
GUICtrlSetImage ($ico,$r,0) ;показ иконки на кнопке
; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()
Select
Case $msg=$deMount
$system = StringLeft(@WindowsDir, 2)
If GUICtrlRead($combo)=$system then
MsgBox(8192,"Warning", "Осторожно !!! Вы выбрали системный диск")
EndIf
$deMountMsg=msgbox(8212,"Demounted", "Демонтировать диск "&GUICtrlRead($combo)&" Уверен?")
If $deMountMsg=6 then ;если Да то
Run("mountvol.exe"&" "&GUICtrlRead($combo)&" /D") ;демонтируем выбранный раздел
EndIf
Case $msg=$mount
$MountMsg=msgbox(8260,"Mounted", "Смонтировать диск "&GUICtrlRead($combo))
;msgbox(8260,"Mounted", $MountMsg)
If $MountMsg=6 then ;если Да то
$point = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", GUICtrlRead($combo)) ;читаем точку монтирования
;msgbox(8260,"Mounted", $point)
$point=StringReplace( $point, "\??\Volume", "\\?\Volume") ;меняем строку для mountvol
;msgbox(8260,"Mounted", $point)
Run("mountvol.exe"&" "&GUICtrlRead($combo)&" "&$point) ;монтируем выбранный раздел
EndIf
Case $msg=$combo ;при выборе диска
$str = StringLeft(GUICtrlRead($combo), 1) ;берем только букву
$r=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\"&$str&"\DefaultIcon", "") ;читаем путь к иконке
GUICtrlSetImage ($ico,"shell32.dll",8) ;показ иконки на кнопке по умолчанию
GUICtrlSetImage ($ico,$r,0) ;показ иконки на кнопке
$system = StringLeft(@WindowsDir, 2)
If GUICtrlRead($combo)=$system then ;если диск системный
MsgBox(8192,"Warning", "Осторожно !!! Вы выбрали системный диск") ;появляется предупреждение
EndIf
Case $msg=$search
$fixedDrive = DriveGetDrive( "fixed" ) ;все fixed диски
If NOT @error Then
;MsgBox(4096,"", "Found " & $fixedDrive[0] & " drives")
For $i = 1 to $fixedDrive[0] ;ищем все фиксированные диски
;MsgBox(4096,"Drive " & $i, $fixedDrive[$i])
$key = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", "\DosDevices\" & $fixedDrive[$i]) ;ищем все значения фиксированных дисков в реестре
;MsgBox(4096, "\DosDevices\" & $fixedDrive[$i], $key)
For $ii = 1 to 100
$a = RegEnumVal("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", $ii) ;просмотр ветви MountedDevices
If @error <> 0 Then ExitLoop
;MsgBox(4096, "HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices" & $ii, $a)
$result = StringInStr($a, "\??\Volume") ;проверка на наличие строк "\??\Volume"
;MsgBox(0, "Search result:", $result)
If $result = 1 Then ;если строки "\??\Volume" есть
$v = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices", $a) ;то читаем значения этих ключей
;MsgBox(4096, $a, $v)
If $v = $key Then
;MsgBox(4096, $fixedDrive[$i], $a) ;найденные соответствия буквы диска и точки монтирования
; Write a single REG_SZ value
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", $fixedDrive[$i], "REG_SZ", $a) ;запись результата в реестр
EndIf
EndIf
next
Next
EndIf
GUICtrlDelete($combo) ;удаляем старое combo
$regEnumVal = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", 1) ;читаем первое значение из реестра
$combo=GUICtrlCreateCombo ($regEnumVal, 45,10,35) ; создаем combo
For $i = 1 to 100
$regEnumVal = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", $i) ;читаем в цикле реестр
if @error <> 0 Then ExitLoop
GUICtrlSetData($combo,$regEnumVal) ; добавляем в combo буквы fixed дисков
next
ControlEnable("", "", $ico) ;кнопка $ico активна
$str = StringLeft(GUICtrlRead($combo), 1) ;берем только букву
$r=RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\"&$str&"\DefaultIcon", "") ;читаем путь к иконке
GUICtrlSetImage ($ico,"shell32.dll",8) ;показ иконки на кнопке по умолчанию
GUICtrlSetImage ($ico,$r,0) ;показ иконки на кнопке
Case $msg=$ico
$str = StringLeft(GUICtrlRead($combo), 1) ;берем только букву
$icoPatch = FileOpenDialog("Выбор иконки", "", "Icons (*.ico;*.dll;*.exe)", 1 ) ;окно выбора файла
If $icoPatch<>"" then ;если путь не пустой
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DriveIcons\"&$str&"\DefaultIcon", "", "REG_SZ", $icoPatch) ;запись в реестр пути к иконке
GUICtrlSetImage ($ico,"shell32.dll",8) ;показ иконки на кнопке по умолчанию
GUICtrlSetImage ($ico,$icoPatch,0) ;показ иконки на кнопке
EndIf
EndSelect
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend
версию не помню, на всякий случай прикрепляю exe
Очень хорошо! Но странная штука, у меня SciTE наглухо повисает при открытии скрипта, с чего бы это?
Может из-за кирилицы, хотя я не знаю там вроде это должно итак быть?
Попробую разные куски кода повытирать, чтоб уточнить это.
(Редактор у меня навороченный, вместе с Wrapper версия)
Подправте код пожалуйста? Идея такова, чтобы вообще исключить системный диск из GUICtrlCreateCombo,
если это вообще возможно, так как это было бы более логично, чем вывод "Warning !!!".
Мне утилита очень понравилась, поэтому хочется её улучшить.
Ещё было бы хорошо метку диска вывести в заголовок окна, хотя тоже надо думать как заполучить переменную $label ?
Может быть обработкой cmd.exe /c vol ?
В исходнике было пропущено <ButtonConstants.au3>
И ещё просьба, можно ли как-то считать серийный номер партишна, и желательно вывести в Edit() для возможности редактирования в окне. Как бы бонус :) ???
17 строка...
...
$regEnumVal = StringRegExpReplace(RegEnumVal("HKLM\Software\Node", $i) , "[^" & StringLeft(@WindowsDir, 2) & "]", "");читаем в цикле реестр
...
Пытаюсь исключить букву системного диска из списка, не получается. :)
madmasles
17-09-2010, 01:36
semiono,
Попробуйте так:$combo = GUICtrlCreateCombo('', 45, 10, 35) ; создаем combo
;...
$regEnumVal = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\RZ\MoDev", $i) ;читаем в цикле реестр
If @error <> 0 Then ExitLoop
If $regEnumVal <> StringLower(@HomeDrive) Then
GUICtrlSetData($combo, $regEnumVal, $regEnumVal) ; добавляем в combo буквы fixed дисков
EndIf
;...
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.