You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Windows API获取音频设备在Sound Control Panel和Volume Mixer中的图标?

如何通过Windows API获取指定音频设备的图标

当然可以!Windows提供了一套完整的原生API来搞定这个需求,核心是结合Core Audio APIs拿到音频设备的关键信息,再配合Shell相关API提取对应图标。下面是具体的实现步骤和实用代码片段:

1. 先拿到音频设备的核心信息

首先得用Core Audio里的IMMDeviceEnumerator来枚举或定位目标音频设备,获取它的IMMDevice接口实例。通过这个接口,你能拿到设备ID,还能打开属性存储读取设备的硬件ID、设备路径这些关键数据——这是后续获取图标的基础。

举个C++的示例:

#include <mmdeviceapi.h>
#include <propvarutil.h>
#include <atlbase.h>

// 先初始化COM环境
CoInitialize(nullptr);

CComPtr<IMMDeviceEnumerator> pEnumerator;
CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);

CComPtr<IMMDevice> pTargetDevice;
// 这里以获取默认播放设备为例,你也可以枚举所有设备找到你需要的那一个
pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pTargetDevice);

// 获取设备ID(可选,用来标识设备)
LPWSTR pwszDeviceId = nullptr;
pTargetDevice->GetId(&pwszDeviceId);

// 打开设备属性存储
CComPtr<IPropertyStore> pPropStore;
pTargetDevice->OpenPropertyStore(STGM_READ, &pPropStore);

// 读取设备的硬件ID(用来匹配图标)
PROPVARIANT pvHardwareId;
PropVariantInit(&pvHardwareId);
pPropStore->GetValue(PKEY_Device_HardwareIds, &pvHardwareId);

2. 提取设备对应的图标

拿到硬件ID或者设备路径后,就可以用Shell API来提取图标了,最常用的是SHGetFileInfo,它能直接根据设备路径或硬件ID返回图标句柄:

用SHGetFileInfo获取图标

#include <shellapi.h>

SHFILEINFO sfi = {0};
// pvHardwareId.pwszVal就是我们刚才拿到的设备硬件ID路径
SHGetFileInfo(pvHardwareId.pwszVal, FILE_ATTRIBUTE_DEVICE, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_SMALLICON);

// 现在sfi.hIcon就是获取到的小图标句柄,用完记得销毁它释放资源
DestroyIcon(sfi.hIcon);

如果硬件ID不好用,还可以读取设备的路径属性来尝试:

PROPVARIANT pvDevicePath;
PropVariantInit(&pvDevicePath);
pPropStore->GetValue(PKEY_Device_DevicePath, &pvDevicePath);

// 获取大尺寸图标
SHGetFileInfo(pvDevicePath.pwszVal, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON);

3. 一些需要注意的细节

  • 所有COM接口用完一定要调用Release()(如果用了ATL的CComPtr会自动处理,省不少事),图标句柄用完必须调用DestroyIcon(),不然会内存泄漏。
  • Win10和Win11对部分属性键的支持可能有细微差别,优先用PKEY_Device_DevicePath或PKEY_Device_HardwareIds更稳妥。
  • 要是想拿到和系统音量控制面板里完全一样的图标,记得用SHGFI_SMALLICON或SHGFI_LARGEICON参数匹配系统的图标尺寸。

如果是用C#开发,你可以通过P/Invoke封装这些原生API,或者直接用NAudio这类第三方库来简化操作——底层其实还是调用这些Windows API啦。

内容的提问来源于stack exchange,提问作者nixx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:57:30