我一直想知道为什么 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
当然,您也可以创建快捷方式,以便通过单击或组合键来打开/关闭托盘:
您还可以添加关闭使用以下 .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
答案3
答案4
我按照 Karan 的回答操作并且成功了!
我唯一想改进的是隐藏运行上下文菜单或快捷方式时闪烁的控制台窗口。我将返回值保存到一个变量中,并将 powershell 脚本编译为 gui 可执行文件:
- 另存为以下内容托盘_打开.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);
- 另存为以下内容托盘_关闭.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);
- 下载微软的 WMF 5.1如果操作系统不是 Windows 10 或更高版本:
powershell.exe
Set-ExecutionPolicy RemoteSigned
.\Install-WMF5.1.ps1
<click> "Restart Now"
- 安装适用的包和模块:
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
- 将 powershell 脚本编译为 gui 可执行文件托盘打开程序和托盘关闭工具:
powershell.exe
ps2exe tray_open.ps1 -noConsole
ps2exe tray_close.ps1 -noConsole
- 最后,将以下命令保存到托盘命令注册表文件,然后运行它来创建 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"