6

Мне всегда было интересно, почему в Windows есть опция « Извлечь», но в контекстном меню оптических дисководов нет соответствующей опции « Закрыть / закрыть лоток» .

Есть ли способ закрыть лоток оптического привода без использования стороннего программного обеспечения в Windows?

7 ответов7

11

Единственный способ сделать это ММО без использования 3 - й партии утилит (например, NirCmd и Wizmo) будет с помощью VBScript или PowerShell. Все решения VBScript, которые я видел до сих пор, используют устаревший Windows Media Player OCX. Я не знаю, включают ли последние версии WMP OCX с аналогичными функциями или нет, плюс отключение / удаление его с помощью функций Windows может в любом случае помешать работе сценария.

Распространенным способом реализации этой функциональности с помощью кода является использование API- интерфейсов Media Control Interface (MCI) (в частности, команды set). Однако, поскольку VBScript не поддерживает вызов обычных функций Windows API или даже функций из произвольных библиотек DLL, это оставляет нас с PowerShell. Таким образом, следующее должно работать из коробки в Windows 7+, которая поставляется с предустановленной PS, и в XP/Vista после установки PS. MCI DLL, т.е. Windows\System32\WinMM.dll, должна быть доступна как часть установки по умолчанию в XP+.

1) Сохраните следующее как CD_Open.ps1:

$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA('set cdaudio door open', $null, 0, 0);

2) Сохраните следующее как CD_Close.ps1:

$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA("set cdaudio door closed", $null, 0, 0);

Теперь приходит проблема. По умолчанию неподписанные сценарии PS не могут выполняться в Windows по соображениям безопасности. Введите get-help about_signing в приглашении PS, чтобы узнать больше об этом, в том числе о том, как самостоятельно подписывать свои сценарии и так далее.

К счастью, есть обходной путь, как указано выше командой get-help :

TO PERMIT SIGNED SCRIPTS TO RUN
-------------------------------
   When you start Windows PowerShell on a computer for the first time, the
   Restricted execution policy (the default) is likely to be in effect.

   The Restricted policy does not permit any scripts to run.

   To find the effective execution policy on your computer, type:

       get-executionpolicy

   To run unsigned scripts that you write on your local computer and signed
   scripts from other users, use the following command to change the execution
   policy on the computer to RemoteSigned:

       set-executionpolicy remotesigned

   For more information, see Set-ExecutionPolicy.

3) Итак, из командной строки с повышенными привилегиями выполните следующую команду:

powerhell set-executepolicy remotesigned

(Вы можете запустить powershell set-executionpolicy restricted чтобы вернуться к настройкам по умолчанию.)

Эту команду необходимо выполнить только один раз, и она действует до тех пор, пока вы снова не измените политику выполнения.

4) Теперь вы можете использовать следующие команды (даже из командной строки без повышенных прав) для открытия / закрытия лотка оптического привода:

powershell -file CD_Open.ps1
powershell -file CD_Close.ps1

Конечно, вы также можете создавать ярлыки, так что вы можете открывать / закрывать лоток одним нажатием или сочетанием клавиш:

Ярлыки лотка для компакт-дисков

Вы также можете добавить команду « Закрыть» в контекстное меню вашего оптического привода, используя следующую информацию.REG-файл:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell]
@="none"

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray]
@="Close"

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray\command]
@="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Powershell.exe -windowstyle hidden -file I:\\CD_Close.ps1"

(Отредактируйте пути по мере необходимости. Кроме того, параметр -WindowStyle доступен только в PS 2.0+.)

4

Вот пример. Вот реализация в C # .. (может потребоваться DLL или две).

Их много, поэтому, если один не работает, попробуйте другой.

2

Я не пробовал это сам, но может быть это поможет Ссылка
Но вы должны скачать DLL
Вот исходный код C, чтобы сделать это, если вы хотите скомпилировать его самостоятельно, но вам нужно найти способ интегрировать скомпилированную программу в контекстное меню проводника Windows для кода C дисковода CD

0

Вполне возможно, что кнопка « Eject изначально была разработана для случаев аппаратного сбоя, когда аппаратная кнопка больше не реагировала.

Закрытие с другой стороны, как правило, можно сделать, просто вставив диск внутрь. Это, возможно, причина не добавлять закрытие.

Также eject хорошо работает на виртуальных / смонтированных дисках (mac dmgs, любые смонтированные диски), usb-дисках (как безопасно удалить) и т.д., Где нет версии close.

0

В Linux (и, следовательно, вероятно, в OSX, BSD, UNIX и т.д. И т.д.)«Для этого есть приложение»:

eject -t
0

Вы не указали, какую версию Windows вы используете. Я только что заметил в моей системе Windows 2000, что программа CD Player (в Пуск> Стандартные> Развлечения) имеет кнопку извлечения. Нажатие на эту кнопку извлечения откроет лоток, если лоток закрыт, и закроет лоток, если лоток открыт.

0

есть другой способ. в проигрывателе Windows Media (по крайней мере, в 12), вы можете нажать вверху Play, затем Eject и выбрать свой диск. если он уже извлечен, ничего не произойдет. затем сделайте это снова, и он должен закрыть диск :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .