Como fechar a bandeja da unidade óptica no Windows?

5

Sempre me perguntei por que o Windows tem uma opção Ejetar , mas não inclui uma opção Fechar / Fechar Bandeja no menu de contexto de unidades ópticas. p>

Existe uma maneira de fechar a bandeja da unidade óptica sem o uso de qualquer software de terceiros no Windows?

    
por Reza M. 06.12.2012 / 06:13

7 respostas

10

A única maneira de fazer esse IMO sem o uso de 3 utilitários de partido rd (como NirCmd e Wizmo ) seriam via VBScript ou PowerShell . Todas as soluções VBScript que vi até agora usam um desatualizado Windows Media Player OCX. Não sei se as versões mais recentes do WMP incluem um OCX com funcionalidade semelhante ou não, além de desativá-lo / desinstalá-lo via Recursos do Windows pode interferir no funcionamento do script em qualquer caso.

Uma maneira comum de implementar essa funcionalidade por meio do código é usando o MCI (Media Control Interface) APIs (especificamente, o set comando ). No entanto, como o VBScript não oferece suporte a chamada funções normais da API do Windows ou até mesmo funções de DLLs arbitrárias, que nos deixa com o PowerShell. Assim, o seguinte deve funcionar fora da caixa no Windows 7+ que vem com o PS pré-instalado e no XP / Vista após o PS ser instalado. A DLL MCI, ou seja, Windows \ System32 \ WinMM.dll, deve estar disponível como parte da instalação padrão no XP +.

1) Salve o seguinte como 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) Salve o seguinte como 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);

Agora vem o problema. Por padrão, os scripts PS não assinados não podem ser executados no Windows por motivos de segurança. Digite get-help about_signing no prompt do PS para saber mais sobre isso, incluindo como assinar seus scripts e assim por diante.

Por sorte, há uma solução alternativa conforme o comando get-help acima:

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) Então, a partir de um Prompt de Comando elevado , execute o seguinte comando:

powershell set-executionpolicy remotesigned

(Você pode executar powershell set-executionpolicy restricted para reverter para a configuração padrão.)

Esse comando precisa ser executado apenas uma vez e permanece em vigor até que você altere a política de execução novamente.

4) Agora você pode usar os seguintes comandos (mesmo de um Prompt de Comando não elevado) para abrir / fechar a bandeja da unidade óptica:

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

Você também pode criar atalhos para abrir / fechar a bandeja com um clique ou com uma combinação de teclas:

VocêtambémpodeadicionarocomandoFecharaomenudecontextodasuaunidadeópticausandooseguintearquivo.REG:

WindowsRegistryEditorVersion5.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"

(Edite os caminhos conforme necessário. Além disso, o parâmetro -WindowStyle só está disponível no PS 2.0 +.)

    
por 01.01.2013 / 03:44
3

Aqui é um exemplo. Aqui é uma implementação em C # .. (pode requerer uma DLL ou duas).

Existem muitos deles, então, se um não funcionar para você, tente outro.

    
por 06.12.2012 / 06:27
2

Eu não tentei estes, mas isso pode ajudar Link
Mas você tem que baixar uma dll
Aqui está o código-fonte C para fazê-lo, se você quiser compilá-lo, mas você precisa procurar uma maneira de integrar o programa compilado no menu do botão direito do Windows Explorer para a unidade de CD código C

    
por 06.12.2012 / 06:44
0

Pode ser que o botão Eject tenha sido originalmente projetado para casos de falha de hardware em que o botão de hardware não respondeu mais.

Fechar por outro lado, normalmente pode ser feito apenas pressionando o drive. Isso talvez seja o motivo para não adicionar um close.

Ejetar também funciona bem em unidades virtuais / montadas (mac dmgs, qualquer unidade montada), drives usb (como remover com segurança) etc, onde não há versão de fechamento.

    
por 06.12.2012 / 06:22
0

No Linux (e, portanto, provavelmente em OSX e BSD e UNIXes etc etc), "há um aplicativo para isso":

eject -t
    
por 06.12.2012 / 06:32
0

Você não especificou qual versão do Windows está sendo executada. Acabei de notar no meu sistema Windows 2000, o programa CD Player (em Iniciar > Acessórios > Entretenimento) tem um botão de ejeção. Clicar no botão Ejetar abrirá a bandeja se a bandeja for fechada e fechará a bandeja se a bandeja estiver aberta.

    
por 24.01.2015 / 09:21
0

existe outro caminho. no Windows Media Player (pelo menos em 12), você pode clicar em cima, Reproduzir, Ejetar e escolher sua unidade. se já estiver ejetado, nada acontecerá. então faça de novo, e deve FECHAR o drive:)

    
por 18.02.2018 / 17:33