Windows 10下无需nircmd,通过.bat/AHK脚本静音特定游戏(赛博朋克2077)的方案咨询
Windows 10下无需nircmd,通过.bat/AHK脚本静音特定游戏(赛博朋克2077)的方案咨询
我太懂这种糟心的感觉了!之前用nircmd对绝大多数程序都顺风顺水,唯独碰到赛博朋克2077这种会 spawn 子进程接管音频的顽固分子就卡壳,而且nircmd确实已经停更挺久了,换方案完全是明智之选。下面给你分享几个亲测在Win10上有效的.bat和AHK脚本方案,专门针对这种难搞的游戏:
一、AHK脚本方案(首推,无需额外工具,灵活度拉满)
AutoHotkey对窗口和系统音频的控制天生友好,不管赛博朋克是父进程还是子进程管音频,都能精准定位到对应的音频会话。
方案1:通过窗口标题触发静音(适合游戏前台运行时)
如果你的赛博朋克2077窗口标题固定是「Cyberpunk 2077」,可以用这个脚本,按Ctrl+Alt+M就能快速静音:
; 按Ctrl+Alt+M触发赛博朋克2077静音 ^!m:: ; 获取游戏窗口对应的进程ID WinGet, gamePID, PID, Cyberpunk 2077 if (gamePID) { ; 遍历系统所有音频会话,找到对应PID的会话并静音 asm := ComObjCreate("AudioSessionManager2") enumerator := asm.GetSessionEnumerator() enumerator.MoveFirst() loop { session := enumerator.GetSession() if (session.GetProcessID() = gamePID) { session.SimpleAudioVolume.SetMute(1, "") ToolTip, 赛博朋克2077已静音 😎 SetTimer, ToolTip, -1500 ; 1.5秒后自动关闭提示 break } ; 如果遍历到最后一个会话还没找到,就退出循环 if !enumerator.MoveNext() { ToolTip, 未找到对应音频会话 SetTimer, ToolTip, -1500 break } } } else { ToolTip, 没找到赛博朋克2077的窗口哦 SetTimer, ToolTip, -1500 } return
方案2:通过进程名静音(适合游戏后台运行时)
如果游戏最小化或者窗口标题有变化(比如带版本号),直接按进程名定位更靠谱,同样按Ctrl+Alt+M触发:
^!m:: targetProcess := "Cyberpunk2077.exe" ; 检查进程是否存在 Process, Exist, %targetProcess% gamePID := ErrorLevel if (gamePID) { asm := ComObjCreate("AudioSessionManager2") enumerator := asm.GetSessionEnumerator() enumerator.MoveFirst() loop { session := enumerator.GetSession() if (session.GetProcessID() = gamePID) { session.SimpleAudioVolume.SetMute(1, "") ToolTip, %targetProcess% 已静音 SetTimer, ToolTip, -1500 break } if !enumerator.MoveNext() { ToolTip, 未找到对应音频会话 SetTimer, ToolTip, -1500 break } } } else { ToolTip, 没找到%targetProcess%进程 SetTimer, ToolTip, -1500 } return
二、纯.bat脚本方案(无需AHK,借助PowerShell)
如果不想装AHK,纯bat也能实现,本质是调用PowerShell来操作Windows的Core Audio API,创建一个MuteCyberpunk.bat文件,内容如下:
@echo off setlocal enabledelayedexpansion :: 替换成你找到的实际音频进程名(默认是Cyberpunk2077.exe) set "TARGET_PROCESS=Cyberpunk2077.exe" :: 调用PowerShell执行静音逻辑 powershell -Command "$procName = '%TARGET_PROCESS%'; $procs = Get-Process -Name $procName -ErrorAction SilentlyContinue; if ($procs) { foreach ($p in $procs) { $pid = $p.Id; $asm = [Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{BFA971F1-4D5E-40BB-935E-967039BFBEE4}')); $enum = $asm.GetSessionEnumerator(); $enum.MoveFirst(); do { $sess = $enum.GetSession(); if ($sess.GetProcessID() -eq $pid) { $vol = $sess.SimpleAudioVolume; $vol.SetMute($true, $null); echo '已静音进程: ' $p.Name ' (PID:' $pid ')'; break } } while ($enum.MoveNext()) } } else { echo '未找到名为' $procName '的进程' }" :: 可选:暂停窗口看结果,不需要可以删掉下面这行 pause
关键小技巧:找到真正控制音频的进程
如果上面的脚本还是不行,大概率是你找错了实际管音频的进程,按这个步骤确认:
- 右键任务栏的音量图标 → 打开音量合成器
- 找到赛博朋克2077对应的音频条目
- 右键这个条目 → 点击「转到进程」
- 任务管理器会自动定位到对应的进程,把这个进程名替换到脚本里的目标进程名即可
备注:内容来源于stack exchange,提问作者Kalamalka Kid
相关产品推荐
相关产品推荐

