Как закрыть лоток для оптических дисков в Windows?

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

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

9 ответов

Решение

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

Распространенным способом реализации этой функциональности через код является использование API- интерфейсов интерфейса управления мультимедиа (в частности, команда 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 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

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

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

Вы также можете добавить команду Close в контекстное меню вашего оптического привода, используя следующий файл.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+.)

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

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

Я последовал ответу Карана, и это сработало!

Единственное, что хотелось улучшить, это скрыть окно консоли, которое мигает при запуске контекстного меню или ярлыка. Я сохранил возвращаемое значение в переменной и скомпилировал сценарии PowerShell в исполняемые файлы графического интерфейса:

  1. Сохраните следующее как лоток_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
$result = $cd::mciSendStringA('set cdaudio door open', $null, 0, 0);
  1. Сохраните следующее как лоток_закрыть.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
$result = $cd::mciSendStringA("set cdaudio door closed", $null, 0, 0);
  1. Загрузите Microsoft WMF 5.1, если операционная система отличается от Windows 10 или более поздней версии:
      powershell.exe
Set-ExecutionPolicy RemoteSigned
.\Install-WMF5.1.ps1
<click> "Restart Now"
  1. Установите соответствующие пакеты и модули:
      powershell -version 3.0
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module -Name ps2exe -RequiredVersion 1.0.5
  1. Скомпилируйте сценарии powershell в исполняемые файлы графического интерфейса лоток_open.exe и лоток_закрыть.exe :
      powershell.exe
ps2exe tray_open.ps1 -noConsole
ps2exe tray_close.ps1 -noConsole
  1. Наконец, сохраните следующие команды в файле Tray_cmd.reg , а затем запустите их для создания контекстных меню компакт-диска (измените пути к exe-файлам, как это необходимо для вашей системы):
      REGEDIT4

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

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

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray\command]
@="I:\\utils\\scripts\\exe\\tray_close.exe"

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\opentray]
@="Tray Open"

[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\opentray\command]
@="I:\\utils\\scripts\\exe\\tray_open.exe"

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

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

Это небольшое приложение, которое добавляет кнопку на панель задач для открытия и закрытия оптического привода. http://digola.com/doorcontrol.html

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

eject -t

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

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

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

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

Другие вопросы по тегам