ViSiToR
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Не обязательно внешнюю утилиту подключать (хотя утилита более эффективна в этом случае )... Вариант первый: Код: Run("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", @SystemDir) | Отображает диалог отключения USB-носителей. Вариант второй, использовать объект Shell.Application с пунктом «&Извлечь»: USB Ejector & Monitor Код: #include <GuiConstants.au3> Global $aDrives = 0 GUICreate("USB Ejector & Monitor", 300, 210) $List = GUICtrlCreateList("", 20, 20, 260, 140) $EjectDrive_Button = GUICtrlCreateButton("Eject Drive", 20, 170, 70, 20) $RefreshList_Button = GUICtrlCreateButton("Refresh List", 210, 170, 70, 20) _Check_Drives() AdlibEnable("_Check_Drives", 1000) GUISetState() While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE Exit Case $EjectDrive_Button $sDrive = GUICtrlRead($List) _EjectDrive(StringLower($sDrive)) Case $RefreshList_Button $aCheckDrives = DriveGetDrive("Removable") _SetUSBDrivesList_Proc($List) EndSwitch WEnd Func _Check_Drives() $aCheckDrives = DriveGetDrive("Removable") If Not _aDrivesIsIdent($aDrives, $aCheckDrives) Then $aDrives = $aCheckDrives _SetUSBDrivesList_Proc($List) EndIf EndFunc Func _SetUSBDrivesList_Proc($iCtrlID=-1) GUICtrlSetData($iCtrlID, "") For $i = 1 To UBound($aDrives)-1 If Not _IsFloppyDrives($aDrives[$i]) And DriveStatus($aDrives[$i]) = "READY" Then _ GUICtrlSetData($iCtrlID, StringUpper($aDrives[$i]) & "\") Next EndFunc Func _aDrivesIsIdent(ByRef $avArray1, ByRef $avArray2) Local $iUbound1 = UBound($avArray1), $iUbound2 = UBound($avArray2) If $iUbound1 <> $iUbound2 Then Return False For $i = 1 To $iUbound1-1 If Not _IsFloppyDrives($avArray1[$i], $avArray2[$i]) And _ ($avArray1[$i] <> $avArray2[$i] Or DriveStatus($avArray1[$i]) <> "READY" Or _ DriveStatus($avArray2[$i]) <> "READY") Then Return False Next Return True EndFunc Func _IsFloppyDrives($sDrive1, $sDrive2="") Return StringRegExp($sDrive1, "(?i)[a-b]") Or ($sDrive2 <> "" And StringRegExp($sDrive2, "(?i)[a-b]")) EndFunc Func _EjectDrive($sdLetter, $sVerb="&Извлечь") ;Для английской Winndows $sVerb = "E&ject" ;Раскомментируйте эти строчки для Варианта № 1 ;~ Run("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", @SystemDir) ;~ Return If $sdLetter = "" Then Return 0 Local Const $SSF_DRIVES = 17 Local $oShell, $oNameSpace, $oDrive Local $oEvent = ObjEvent("AutoIt.Error", "Error_Handler") Local $oShell = ObjCreate("Shell.Application") If Not IsObj($oShell) Then Return SetError(1, 0, 0) Local $oNamespace = $oShell.NameSpace($SSF_DRIVES) Local $oDrive = $oNamespace.ParseName($sdLetter) $oDrive.InvokeVerb($sVerb) If @error Then Return 0 If DriveStatus($sdLetter) <> "READY" Then Local $strName = DriveGetLabel($sdLetter) & " (" & StringUpper($sdLetter) & ")" TrayTip("USB Drive " & $strName & " ejected", "You can now remove the device safely.", 5, 1) EndIf Endfunc Func Error_Handler() SetError(1) EndFunc |
---------- ViSiToR a.k.a CreatoR CreatoR это не ник, CreatoR это стиль жизни! |
|