我已经构建了一个外部设备来控制 Windows7 应用程序的级别。串行通信有效,但我正在努力使用内置的 Windows 音频会话 API (WASAPI)。
特别是,我有两个问题:
- WASAPI 是否适合我的问题?对我来说,它似乎太大了
- 如何访问每个正在运行的程序的级别?
如果你能帮我解决这个问题,我会很高兴!
我已经构建了一个外部设备来控制 Windows7 应用程序的级别。串行通信有效,但我正在努力使用内置的 Windows 音频会话 API (WASAPI)。
特别是,我有两个问题:
如果你能帮我解决这个问题,我会很高兴!
尚未检查,但似乎您确实可以为此使用 WASAPI。使用这个http://msdn.microsoft.com/en-us/library/windows/desktop/dd316769%28v=vs.85%29.aspx文档作为起点。我希望它起作用的方式是,对于每个 IMMDevice(从 IMMDeviceEnumerator 获得),您激活一个 IAudioSessionManager,使用它来获得一个 ISimpleAudioVolume,然后您就可以使用 Get/SetMasterVolume 进行会话。为了让 IAudioSessionManager 为您提供 ISimpleAudioVolume,您还需要您想要控制的会话的会话 GUID,因为多个进程可能会以共享模式写入同一设备。为此,您可以使用 IAudioSessionEnumerator 获取“当前”会话,但请注意,这不会随着新会话添加到系统而更新。为此,您将需要 IAudioSessionManager2::RegisterSessionNotification (请注意,有一些特定的线程要求:它必须在 MTA 单元中运行)并实现您自己的回调以将会话添加到某个内部集合(由您维护并最初从 IAudioSessionEnumerator 填充)。另请注意,会话枚举器通知内容为您提供 IAudioSessionControl,您必须将其 QueryInterface 到 IAudioSessionControl2 以获取最终需要控制每个会话音量的会话 guid。最后,您还需要使用 IAudioSessionControl::RegisterAudioSessionNotification 来获取会话主音量更改的通知,以便您可以与(例如)sndvol(Windows 音量混合器)保持同步。再次注意,这一切都来自记忆,我还没有实际测试或验证过这些。关于 WASAPI 过大,是的,我认为你是对的。反正,这至少应该让你开始。祝你好运。