Единственный способ сделать это ММО без использования 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+.)