如何在 Windows 中关闭光驱托盘?

如何在 Windows 中关闭光驱托盘?

我一直想知道为什么 Windows 有一个喷射选项,但不包括相应的关闭 / 关闭托盘光驱上下文菜单中的选项。

有没有办法关闭光驱托盘没有在 Windows 中使用任何第三方软件吗?

答案1

我认为,唯一不需要使用第三方工具(例如近红外命令威兹莫)将通过VB脚本或者电源外壳。到目前为止,我见过的所有 VBScript 解决方案都使用过时的 Windows Media Player OCX。我不知道最新版本的 WMP 是否包含具有类似功能的 OCX,以及通过以下方式禁用/卸载它Windows功能无论如何都可能会干扰脚本的运行。

通过代码实现此功能的一种常见方法是使用媒体控制接口 (MCI)API(具体来说,命令)。但是,由于 VBScript不支持调用普通的 Windows API 函数,甚至调用任意 DLL 中的函数,这就需要使用 PowerShell。因此,在预装 PS 的 Windows 7+ 中,以及在安装 PS 后的 XP/Vista 中,下面的操作应该可以立即使用。MCI DLL 即 Windows\System32\WinMM.dll 应该作为 XP+ 中默认安装的一部分提供。

1)将以下内容保存为CD_打开.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_关闭.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 提示符下输入以了解更多信息,包括如何对脚本进行自签名等等。

幸运的是,有一个解决方法,因为得到帮助上面的命令指出:

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)因此从升高命令提示符,运行以下命令:

powershell 设置执行策略 remotesigned

(您可以运行powershell set-executionpolicy restricted以恢复默认设置。)

此命令只需运行一次,并且一直有效,直到您再次更改执行策略。

4)现在您可以使用以下命令(即使是非提升的命令提示符)来打开/关闭光驱托盘:

powershell -文件 CD_Open.ps1
powershell -文件 CD_Close.ps1

当然,您也可以创建快捷方式,以便通过单击或组合键来打开/关闭托盘:

CD 托盘快捷方式

您还可以添加关闭使用以下 .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+。)

答案2

这里就是一个例子。这里是 C# 中的实现......(可能需要一个或两个 DLL)。

它们有很多,因此,如果一个不适合您,请尝试另一个。

答案3

我自己还没有尝试过,但也许这会有所帮助 关联
但是,如果您想自己编译它,您必须下载一个 dll,
这是 C 源代码,但您需要寻找一种方法将编译后的程序集成到 Windows 资源管理器的 CD 驱动器右键菜单中 C 代码

答案4

我按照 Karan 的回答操作并且成功了!

我唯一想改进的是隐藏运行上下文菜单或快捷方式时闪烁的控制台窗口。我将返回值保存到一个变量中,并将 powershell 脚本编译为 gui 可执行文件:

  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 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. 下载微软的 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 脚本编译为 gui 可执行文件托盘打开程序托盘关闭工具
powershell.exe
ps2exe tray_open.ps1 -noConsole
ps2exe tray_close.ps1 -noConsole
  1. 最后,将以下命令保存到托盘命令注册表文件,然后运行它来创建 cdrom 上下文菜单(根据系统需要更改 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"

相关内容