繁体   English   中英

音量更改事件-音量停止更改时监听

[英]Volume change event - listen when volume stopped changing

我的服务器正在使用第三方库控制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通知时,都应该StopStart它。 尽管它们比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()之后,也可以移到设计器中。

除了多个Timers 之外 ,我认为曾经有一段时间应用程序可以创建的Timers数量被限制为16个。这已经很久了,创建第二个Timer也没有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM