PKEY_AudioEndpoint_StableId屬性為音訊端點提供額外的不透明識別碼。 Windows 嘗試在作業系統更新與音訊驅動程式更新中保留此識別碼。
IMMDevice::GetID 回傳的普通端點 ID 並不穩定。 作業系統更新或音訊驅動程式更新可能導致同一實體周邊設備被分配不同的端點 ID。 因此,應用程式無法使用一般端點 ID 來可靠追蹤實體音訊端點。 PKEY_AudioEndpoint_StableId特性(如有)可用來追蹤實體音訊端點。 一個例子是通訊應用程式會記住使用者選擇的麥克風或喇叭,並在後續會話中還原該選擇。
PROPVARIANT 結構中的 vt 成員被設為 VT_LPWSTR。
PROPVARIANT 結構中的 pwszVal 成員指向一個空終端、寬字元字串,該字串包含音訊端點裝置的穩定識別碼。 若端點沒有穩定 ID,屬性值為VT_EMPTY。 並非每個端點都能保證擁有穩定的 ID。
備註
將屬性值視為不透明且以大小寫區分的字串,並以大小寫區分比較。 不要修改、正規化、重建或解析該值,也不要擷取或依賴任何內部子字串。 字串的內部格式是實作細節。 快取該值,之後再辨識同一端點。
不要將穩定 ID 視為裝置所有特性的不可變識別碼。 其他端點屬性——例如友善名稱和格式特性——可能會改變,而穩定 ID 則保持不變。 當你從快取的穩定 ID 解析裝置後,重新查詢應用程式所依賴的任何可變屬性。
穩定 ID 比一般端點 ID 更耐用,但不保證永遠不變。 Windows 嘗試在作業系統和音訊驅動程式更新中保留此特性。 Windows 能否維持此值取決於音訊驅動程式的行為、周邊韌體、匯流排類型(例如 USB 和藍牙)以及周邊設備所暴露的資訊。 少數周邊設備在作業系統或驅動程式升級後,可能會獲得不同的穩定 ID。
應用程式必須處理以下每種情況:
- 房產價值VT_EMPTY。
- 屬性儲存讀取失敗。
- 快取的穩定 ID 不再透過 IMMDeviceEnumerator::GetDevice 解析到端點。
取得穩定 ID
要取得使用者所選端點的穩定 ID,請執行以下操作:
- 先從 IMMDevice 介面開始,針對所選端點。
- 呼叫 IMMDevice::OpenPropertyStore 方法,並標示 STGM_READ。
- 呼叫 IPropertyStore::GetValue 方法,並使用 PKEY_AudioEndpoint_StableId 屬性鍵。
- 如果回傳的 PROPVARIANT 的 vt 成員是 VT_LPWSTR,則持久化整個 pwszVal 字串。
- 如果該屬性無法取得或VT_LPWSTR(例如舊版 Windows,或值已VT_EMPTY),你可以選擇性地退回到 IMMDevice::GetId。 請注意,備援值較不持久,且在作業系統或音訊驅動程式更新後可能會變得過時。
以下範例會擷取並持久化穩定的 ID。
wil::unique_cotaskmem_string deviceId;
wil::com_ptr_nothrow<IPropertyStore> propertyStore;
if (SUCCEEDED(userSelectedEndpoint->OpenPropertyStore(STGM_READ, &propertyStore)))
{
wil::unique_prop_variant var;
if (SUCCEEDED(propertyStore->GetValue(PKEY_AudioEndpoint_StableId, &var)))
{
if (var.vt == VT_LPWSTR)
{
deviceId.reset(var.release().pwszVal);
}
}
}
後來修復裝置
若要在後續會話中還原裝置,請透過呼叫 CoCreateInstance 建立 MMDeviceEnumerator 物件,然後將快取的 stable-ID 字串作為 pwstrId 參數傳遞給 IMMDeviceEnumerator::GetDevice 方法,以取得 IMMDevice 介面。 處理找不到匹配端點的失敗情況。
HRESULT GetUserAudioEndpoint(_In_ PCWSTR endpointStableId, _COM_Outptr_ IMMDevice** userSelectedEndpoint)
{
*userSelectedEndpoint = nullptr;
wil::com_ptr_nothrow<IMMDeviceEnumerator> enumerator;
RETURN_IF_FAILED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&enumerator)));
RETURN_IF_FAILED(enumerator->GetDevice(endpointStableId, userSelectedEndpoint));
return S_OK;
}
Requirements
| 需求 | 價值 |
|---|---|
| 最低支援的用戶端 |
Windows 11,版本 24H2(版本 26100)[僅限桌面應用程式] |
| 最低支援的伺服器 |
Windows Server 2025(版本 26100)[僅限桌面應用程式] |
| Header |
|