【发布时间】:2020-04-11 02:20:35
【问题描述】:
我正在寻找通过 Powershell 获取默认音频设备的解决方案。 在最好的情况下,它可以通过嵌入式 C# 代码直接使用 IMMDeviceEnumerator::GetDefaultAudioEndpoint(参见此处IMMDeviceEnumertor)。
但如果通过 RegKeys 更容易获得它,那么这也是可以的。 我已经看到几个 code-sn-ps 从 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render 或 \Capture 读取密钥,但我仍然难以识别 DEFAULT 设备。
看来,当我修改设备的顺序时,我可以简单地搜索活动设备(DeviceState=1),然后按值“Level:0”、“Level:1”和“Level:2”排序",但级别值在用户未手动修改订单的系统上不可用。在这种情况下,排序标准是什么?
这是通过 RegKeys 解决它的 code-sn-p,但如前所述 - 并非适用于所有情况:
$regAudio = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio"
$nameId = "{b3f8fa53-0004-438e-9003-51a46e139bfc},6"
$classId = "{a45c254e-df1c-4efd-8020-67d146a850e0},2"
$driverDetails = "{83da6326-97a6-4088-9453-a1923f573b29},3"
function get-DefaultDevice($type) {
$activeDevices = foreach($key in Get-ChildItem "$regAudio\$type\") {
foreach($item in Get-ItemProperty $key.PsPath) {
if ($item.DeviceState -eq $activeState) {$item}
}
}
$defaultDevice = $activeDevices | Sort-Object -Property "Level:0","Level:1","Level:2" | select -last 1
$details = Get-ItemProperty "$($defaultDevice.PSPath)\Properties"
$name = "$($details.$classId) ($($details.$nameId))"
return @{
name = $name
driver = $details.$driverDetails
}
}
$OsRender = get-DefaultDevice "Render"
$OsCapture = get-DefaultDevice "Capture"
有没有办法“以一种智能的方式”获取这些信息(当然,没有任何外部 DLL)?
【问题讨论】: