Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Лёгкое приложение для монтирования логических разделов HDD. (http://forum.oszone.net/showthread.php?t=184698)

semiono 05-09-2010 18:17 1489056

Лёгкое приложение для монтирования логических разделов HDD.
 
Мне нужен GUI интерфейс, примерно 640x480, для быстрого подключения/отключения нужных разделов логических дисков.
Почему хочется иметь самодельный "менеджер", ну потому-что с одной стороны чтобы ничего лишнего не было,
и в то же время может что-то полезное можно придумать. msc- консоли раздражают своими сайд-панелями, всякими табами ненужными.
Программы для hdd могут это делать, но грузятся дольше так как предназначены для более серьёзных задач.

Однако я не знаю как монтировать диски? Из windows знакомо лишь mountvol.exe. Если нету других возможностей, то это получиться
графическая оболочка для mountvol.exe. Прога вдобавок к дискам обращается как CLSID именам, с этим тоже не очень понятно как определиться.
Ещё знаю что всё это пишется в реестр в раздел HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices, но подробнее я тоже не знаю.

Для начала, я бы хотел только иметь окно где галочками можно было бы отключить(запретить), а потом включить по выбору логические диски.
Судя по всему прога(autoit) должна считать сначала все мои разделы и вывести мне их в окне...
?

speechless 10-09-2010 00:00 1492160

Вложений: 1
как то давно делал для себя, посмотри
Код:

#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

semiono 13-09-2010 02:22 1494100

Очень хорошо! Но странная штука, у меня SciTE наглухо повисает при открытии скрипта, с чего бы это?
Может из-за кирилицы, хотя я не знаю там вроде это должно итак быть?
Попробую разные куски кода повытирать, чтоб уточнить это.
(Редактор у меня навороченный, вместе с Wrapper версия)

saavaage 13-09-2010 03:57 1494111

semiono, у меня все ОК. Посмотрите на то, все ли функции у Вас есть в шапке скрипта. Список у меня:
Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>


semiono 16-09-2010 22:30 1497193

Подправте код пожалуйста? Идея такова, чтобы вообще исключить системный диск из GUICtrlCreateCombo,
если это вообще возможно, так как это было бы более логично, чем вывод "Warning !!!".
Мне утилита очень понравилась, поэтому хочется её улучшить.
Ещё было бы хорошо метку диска вывести в заголовок окна, хотя тоже надо думать как заполучить переменную $label ?
Может быть обработкой cmd.exe /c vol ?

В исходнике было пропущено <ButtonConstants.au3>

И ещё просьба, можно ли как-то считать серийный номер партишна, и желательно вывести в Edit() для возможности редактирования в окне. Как бы бонус :) ???

semiono 17-09-2010 00:26 1497276

17 строка...
Код:

...
$regEnumVal = StringRegExpReplace(RegEnumVal("HKLM\Software\Node", $i) , "[^" & StringLeft(@WindowsDir, 2) & "]", "");читаем в цикле реестр
...

Пытаюсь исключить букву системного диска из списка, не получается. :)

madmasles 17-09-2010 01:36 1497312

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
;...


semiono 17-09-2010 02:18 1497331

Как я понял StringLower(@HomeDrive) это именно то что надо, хотя я опять запутался в коде, слишком много для меня. ))


Время: 19:00.

Время: 19:00.
© OSzone.net 2001-