powershell/CMD 设置系统静音(全局)
01 前言
由于自动化程序的需要,要把系统声音设置为静音状态(全局)。找了一下资料,可以通过API的方式实现,记录一下。
02 正文
环境
Windows 11, 64 bit
PSVersion 5.1
使用到win32的两个API:GetForegroundWindow
和SendMessageW
,powershell
版本代码如下:
<#
设置系统静音(全局)
by hokis
2024-11-20 19:28
#>
$code = @'
[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
'@
#引入API
Add-Type -Namespace Windows -MemberDefinition $code -Name 'Windows'
#获取前台窗口句柄
[System.IntPtr]$wi = [Windows.Windows]::GetForegroundWindow()
#命令消息
$WM_APPCOMMAND = 0x319
#减小音量
$APPCOMMAND_VOLUME_DOWN = 0x090000
#增加音量
$APPCOMMAND_VOLUME_UP = 0x0a0000
#静音
$APPCOMMAND_VOLUME_MUTE = 0x80000
#先提高,确保当前处于有声音的状态
$ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_UP)
#静音
$ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_MUTE)
#最后降低,恢复为原来的音量大小
$ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_DOWN)
Write-Host 'success.'
另存为
run.ps1
,右键,选择“使用PowerShell运行”即可
可以转为BAT脚本,另存为run.bat
,双击运行即可,如下:
@echo off
rem created on 2024-11-20 19:39
chcp 65001
cls
cd /d %~dp0
powershell.exe -command "$_sb = [System.Text.StringBuilder]::new(); [void]$_sb.AppendLine('[DllImport('+[char]34+'user32.dll'+[char]34+')] public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);').AppendLine('[DllImport('+[char]34+'user32.dll'+[char]34+')] public static extern IntPtr GetForegroundWindow();'); Add-Type -Namespace Windows -MemberDefinition $_sb.ToString() -Name 'Windows'; [void]$_sb.Clear(); [System.IntPtr]$wi = [Windows.Windows]::GetForegroundWindow(); $WM_APPCOMMAND = 0x319; $APPCOMMAND_VOLUME_DOWN = 0x090000; $APPCOMMAND_VOLUME_UP = 0x0a0000; $APPCOMMAND_VOLUME_MUTE = 0x80000; $ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_UP); $ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_MUTE); $ret=[Windows.Windows]::SendMessageW($wi,$WM_APPCOMMAND,$wi,$APPCOMMAND_VOLUME_DOWN); Write-Host 'success.';"
pause
效果:
03 后记
还比较简单吧。