卷更改而不创建IAudioEndpointVolume的通知

时间:2014-01-31 21:10:30

标签: c++ windows windows-services volume

我已经编写了一个C ++应用程序,它作为Windows服务运行,以限制Windows 7计算机的容量。用户可以为不同的日期和时间指定不同的规则,服务将平滑地改变音量。为了实现这一点,我使用IAudioEndpointVolume接口。一般来说,它的工作方式与预期相符......

然而,存在一种我无法解释的奇怪行为。切换用户时,音量会突然下降,但不会像预期的那样生成通知。同样奇怪的是,SndVol.exe中的滑块显示卷的正确值。 由于缺少通知,我的程序无法对此更改做出反应,因此无法执行其意图。 我发现如果稍微移动音量滑块,音量将再次切换回正确的音量。当然,这会生成一个由我的服务处理的通知。我的服务将强制正确的音量。

我不明白为什么卷在SndVol.exe中不可见而且没有创建通知时会发生变化。切换回第一个用户帐户无法解决问题。即使在注销后,音量仍处于错误的水平。

据我所知,有关IAudioEndpointVolume接口的文档没有提及有关不同用户会话的任何内容。

有关可能导致此问题的原因或我可以尝试修复此问题的任何想法?

2 个答案:

答案 0 :(得分:1)

您的服务在会话0中运行,会话0是一个隔离会话,可防止恶意软件执行破坏性攻击。用户的桌面在另一个会话中运行,可以有多个。 WASAPI文档没有说明音频会话在Windows会话中的映射方式。你有一个非常强烈的暗示,它不是从它的行为方式。

该部分中有不祥的词语谈论grouping parameters。一种主要用于允许Sndvol识别共享相同音量控制的进程的构造。它引用资源管理器作为示例,这个过程可以多次启动,但仍然只有一个音量控制。不想共享的进程使用会话标识符GUID_NULL来选择IAudioSessionControl :: SetGroupingParam()中的默认会话,或者只是省略该调用,因为这是默认值。

Sndvol的行为,它只显示在桌面会话中运行的进程的卷控制。您无法在另一个桌面会话中看到进程。非常强烈地提示音频会话GUID_NULL特定于创建它的会话。

只要您使用服务执行此操作,就不太可能找到解决方法。

相反,请考虑将程序作为在用户桌面会话中运行的常规无窗口进程运行。 Run注册表项或Startup文件夹快捷方式或任务计划程序入门。

答案 1 :(得分:0)

好吧,过了一段时间后,我现在非常确信音量变化是由我们正在使用的第三方驱动程序引起的。该驱动程序具有自己的音量控制机制。在启动驱动程序的控制GUI后,我不再体验到更改。即使重启后问题似乎也得到解决。然而,经过一段时间后,它再次被打破,原因我无法弄清楚。但这只是因为某些安全设置阻止了驱动程序的控制GUI以非管理员身份登录时启动。我现在解决了这个问题,希望现在一切顺利。

此外,所有用户会话看起来都共享相同的音量控制。这意味着如果我在一个用户会话中使用SndVol更改卷,则在另一个用户会话中会发生相同的更改。我的服务会收到所有这些更改的通知。所以看起来我在用户之间切换时没有收到通知,因为更改是由以管理员身份登录时启动的驱动程序控制GUI引起的。但是这种变化发生在驱动程序中,一个较低的层,因此Windows不知道这种变化。

我们使用的驱动程序是kX Audio Driver