音量变化事件-当音量停止变化时收听
本文关键字:变化 事件 | 更新日期: 2023-09-27 18:09:36
我的服务器正在使用第三方库控制windows卷。当服务器从客户机获得通知它更改音量的消息时,它正在做它需要做的事情,没有任何问题。但是,无论何时在计算机上本地更改卷,我都要通知客户端。
我正在使用的这个库(https://workspaces.codeproject.com/ray-m/vista-core-audio-api-master-volume-control/article),有一个通知音量变化的事件。
问题是,它通知每一个小的音量变化步骤,因此,当用户改变音量时,委托被调用了很多次。例子:
如果当前音量为-23db,用户将音量调到-13db,那么委托将被调用10次!
我如何侦听用户何时开始更改音量,然后何时结束操作?
这样我就可以通过委托向客户端发送一次更新。
代码尝试:
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
VolumeTimer.Interval = 300;
VolumeTimer.Stop();
VolumeTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{
VolumeTimer.Stop();
lock (_lock)
{
++_volumeCalledCounter;
if (_volumeCalledCounter <= 1)
{
Console.WriteLine("Fired");
_volumeCalledCounter = 0;
}
}
}
是的,Timer
可以反复射击。因此,每次收到volumeChange通知时,都应该设置Stop
和Start
。虽然这些比Timer.Interval
来得快,但不会发生其他事情。一旦他们停止来袭,Timer.Tick
最终会开火。在这里您最后一次停止Timer
并触发您自己的事件。
使用Timer VolumeTimer
和原始来源:
defaultDevice.AudioEndpointVolume.OnVolumeNotification += new
AudioEndpointVolumeNotificationDelegate(
AudioEndpointVolume_OnVolumeNotification);
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
VolumeTimer.Interval = 100; // ms, test to gauge!
VolumeTimer.Stop();
VolumeTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{
VolumeTimer.Stop();
// whatever you want to do, when the volume no longer changes:
yourEvent();
}
编辑:以上代码应该能解决原来的问题。
然而,如果用户缓慢地改变音量,但持续很长时间,您的事件不会一直触发。如果你想要强制UI更新,那么使用第二个Timer VolumeUiTimer
:
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
VolumeTimer.Interval = 100; // ms, test to gauge!
VolumeTimer.Stop();
VolumeTimer.Start();
if (!VolumeUiTimer.Enabled)
{ VolumeUiTimer.Interval = 500; VolumeUiTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{ // no more changes: all timers stop, update UI
VolumeTimer.Stop();
VolumeUiTimer.Stop();
// whatever you want to do, when the volume no longer changes:
yourEvent();
}
private void VolumeUiTimer_Tick(object sender, EventArgs e)
{ //restart timer1, stop timer2, update UI
VolumeTimer.Stop();
VolumeTimer.Start();
VolumeUiTimer.Stop();
// whatever you want to do, when the volume no longer changes:
yourEvent();
}
我在这里设置Intervals
只是为了演示;它们可以移动到InitializeComponent()
之后,或者直接放到设计器中。
Aside在多个Timers
上:曾经有一段时间,一个应用程序可以创建的Timers
的数量是有限的,我想是16。这是很久以前的事了,创建第二个Timer
没有问题。