Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Drive", в содержании - "File, Directory and Disk Management" - "Drive", v1.0.46.09.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

Drive

Выдвигает/втягивает лоток CD- или DVD-привода, а также задаёт метку диска.

Drive, Sub-command [, Drive , Value]

Параметры Sub-command, Drive и Value зависят друг от друга, их использование описано ниже.

Label, Drive [, NewLabel]: меняет метку диска на указанную в NewLabel (если NewLabel опущен, у диска не будет метки). Drive задаётся как буква диска с двоеточием и необязательной обратной косой чертой (может также работать для UNC-путей и сетевых дисков). Пример: Drive, Label, C:, Seagate200

Чтобы узнать текущую метку, следуйте этому примеру: DriveGet, OutputVar, Label, C:

Lock, Drive: блокирует выдвижение лотка. Например: "Drive, Lock, D:". Большинство приводов не могут быть блокированы, когда они открыты, применение этой команды, вероятно, приведёт к тому, что привод заблокируется, как только он будет закрыт. Эта команда не действует на приводы, которые не поддерживают возможность блокировки (например, большинство только читающих), также маловероятно, что она сработает для не-IDE приводов в Windows 95/98/Me. Если привод заблокирован скриптом и этот скрипт завершается, привод останется блокированным, пока его не разблокирует другой скрипт или другая программа либо до перезагрузки системы. Если указанный привод не существует или не поддерживает блокировку, ErrorLevel будет равен 1. Иначе он устанавливается в 0.

Unlock, Drive: разблокирует лоток. В Windows NT/2000/XP и более поздних Unlock нужно применять столько же раз, сколько использовалась команда Lock (по крайней мере для некоторых приводов). Например, если "Drive, Lock, D:" выполнялось три раза, то может потребоваться троекратное выполнение "Drive, Unlock, D:". По этой причине и в связи с тем, что не существует способа определить, заблокирован ли в данный момент привод, полезно сохранять эту информацию в переменной.

Eject [, Drive, 1]: выдвигает или втягивает лоток CD- или DVD-привода (для извлечения других типов носителей или устройств смотрите пример с DllCall в конце этой статьи).

Если параметр Drive опущен, используется CD/DVD-привод по умолчанию. Для выдвигания лотка опустите последний параметр. Для втягивания/закрытия задайте его как 1; например, Drive, Eject, D:, 1

Команда Drive Eject ждёт завершения выдвижения или втягивания лотка прежде чем позволить скрипту выполняться дальше. Если лоток уже находится в указанном положении, ErrorLevel устанавливается в 0 (т.е. "нет ошибки").

Drive Eject, вероятно, не будет работать для сетевых дисков или не-CD/DVD-дисков. Если она завершается неудачей по этой или другой причине, ErrorLevel устанавливается в 1.

Предыдущее состояние лотка можно определить, измеряя время, которое занимает выполнение команды. Например, следующая горячая клавиша переводит лоток в противоположное состояние (открыт/закрыт).

#c::
Drive, Eject
; Если команда выполняется быстро, лоток, вероятно, уже был открыт.
; В таком случае, закрываем его:
if A_TimeSinceThisHotkey < 1000 ; Поставьте другое время, если нужно.
    Drive, Eject,, 1
return

Чтобы определить состояние носителя в CD/DVD-приводе (проигрывается, остановлен, открыт и т.п.), смотрите описание команды DriveGet.

ErrorLevel

Равен 1, если были проблемы, иначе 0.

Примечания

Ниже показан альтернативный метод извлечения, который также работает для носителей/устройств, отличающихся от CD/DVD.

; Укажите в строке ниже нужную букву диска (в остальном коде ничего исправлять не нужно).
Driveletter = I: ; Буква диска для извлечения.

hVolume := DllCall("CreateFile"
    , Str, "\\.\" . Driveletter
    , UInt, 0x80000000 | 0x40000000 ; GENERIC_READ | GENERIC_WRITE
    , UInt, 0x1 | 0x2 ; FILE_SHARE_READ | FILE_SHARE_WRITE
    , UInt, 0
    , UInt, 0x3 ; OPEN_EXISTING
    , UInt, 0, UInt, 0)
if hVolume >> -1
{
    DllCall("DeviceIoControl"
        , UInt, hVolume
        , UInt, 0x2D4808 ; IOCTL_STORAGE_EJECT_MEDIA
        , UInt, 0, UInt, 0, UInt, 0, UInt, 0
        , UIntP, dwBytesReturned ; Не используется.
        , UInt, 0)
    DllCall("CloseHandle", UInt, hVolume)
}

Примеры

Drive, Label, D:, BackupDrive
Drive, Eject,, 1 ; Втянуть (закрыть) лоток CD/DVD-привода по умолчанию.

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.