我的服务器正在使用第三方库控制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;
}
}
}
答案 0 :(得分:2)
是的,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()
之后转移到设计师手中。
Timers
上的 除了:有一段时间,应用程序可以创建的Timers
数量限制为,我认为16.这已经很久了创建第二个Timer
是没问题的。