句柄是 Windows 核心物件的**不透明識別碼**(本質是 32/64 位整數),應用程式無法直接存取核心物件記憶體,必須透過句柄呼叫 API 間接操作。常見類型:
HWND - 視窗/控制項HINSTANCE - 模組實例HANDLE - 通用核心物件 (檔案、執行緒、程序、同步物件、裝置)HDC - 裝置內容HKEY - 登錄鍵IMMDeviceEnumerator、IAudioEndpointVolume、IAudioSessionControl — **現代標準,無需 HWND**。mixerOpen/SetControlDetails — 僅相容 XP/Win7 早期。CreateFile 取得 HANDLE 再 DeviceIoControl。| 類型 | 資源 | 備註 |
|---|---|---|
| 官方文件 | Microsoft Core Audio API | 最權威、範例完整 |
| 經典書籍 | 《Windows 核心程式設計》(第 5 版) - Jeffrey Richter | 句柄、執行緒、同步、I/O 核心觀念 |
| 經典書籍 | 《Windows 程式設計》(第 5 版) - Charles Petzold | HWND、訊息迴圈、GDI、視窗程式基礎 |
| 程式碼範例 | Windows-classic-samples (GitHub) → Samples/Win7Samples/multimedia/audio/ | 可直接編譯執行的音訊控制範例 |
| 中文教學 | CSDN / 博客園 搜尋 "Core Audio API C++ 音量控制" | 大量實戰代碼片段 |
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <iostream>
#pragma comment(lib, "Ole32.lib")
int main() {
CoInitialize(nullptr);
IMMDeviceEnumerator* pEnumerator = nullptr;
CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);
IMMDevice* pDevice = nullptr;
pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
IAudioEndpointVolume* pVolume = nullptr;
pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr, (void**)&pVolume);
float currentVol = 0;
pVolume->GetMasterVolumeLevelScalar(¤tVol);
std::cout << "Current volume: " << (currentVol * 100) << "%\n";
pVolume->SetMasterVolumeLevelScalar(0.5f, nullptr); // 設 50%
pVolume->Release(); pDevice->Release(); pEnumerator->Release();
CoUninitialize();
return 0;
}
Activate 會回傳 E_ACCESSDENIED。控制外置聲卡請直接學習 **Core Audio API (IMMDeviceEnumerator, IAudioEndpointVolume)**,參考 Microsoft 官方文件與 GitHub 範例。句柄只是核心物件的代號,掌握「取得介面 → 呼叫方法 → 釋放介面」的 COM 模式即可,無須深究 HWND 內部結構。