我正在尝试通过在C#WPF应用程序中调用Win32 API来更改系统的音量。我看过的每个网站都显示了与以下内容类似的代码:
double val_c = 0;
private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
const uint WM_APPCOMMAND = 0x319;
const uint APPCOMMAND_VOLUME_UP = 10;
const uint APPCOMMAND_VOLUME_DOWN = 9;
const uint APPCOMMAND_VOLUME_MUTE = 8;
IntPtr handy = this.Handle;
if (slider1.Value < val_c)
{
Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, new IntPtr(APPCOMMAND_VOLUME_DOWN));
}
else
{
Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, new IntPtr(APPCOMMAND_VOLUME_UP));
}
val_c = slider1.Value;
}
我无法弄清楚在哪里指定我想要设置的确切值。
以上代码以什么值增加音量?实际上,尽管上面发布在几个论坛,博客等上,但我无法让它发挥作用。它仅在您向最后一个参数添加“* 0x10000”时才有效。即便如此,我也无法弄清楚它的重要性。
当滑块(最小值为0且最大值为100)的值发生变化时,我执行了上述设置,但滑块与实际系统卷不同步。只需将滑块设置为25即可将系统音量设置为100。
答案 0 :(得分:1)
我认为有两个问题。一个是消息参数的定义,应该如下
const uint WM_APPCOMMAND = 0x319;
const uint APPCOMMAND_VOLUME_UP = 0xA0000;
const uint APPCOMMAND_VOLUME_DOWN = 0x90000;
const uint APPCOMMAND_VOLUME_MUTE = 0x80000;
另一个是您需要多次应用向上/向下更改,具体取决于滑块当前值与之前值之间的差异。
所以,这样的事情(请注意,消息参数应该只被转换为IntPtr
而不是new
'ed
if (slider1.Value < val_c)
{
int nDiff = (int)(val_c - slider1.Value);
for (int i = 0; i < nDiff; ++i)
{
Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, (IntPtr)APPCOMMAND_VOLUME_DOWN);
}
}
else
{
int nDiff = (int)(slider1.Value - val_c);
for (int i = 0; i < nDiff; ++i)
{
Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, (IntPtr)APPCOMMAND_VOLUME_UP);
}
}
上面的代码可以稍微简化一下:
IntPtr pArg = (slider1.Value < val_c) ? (IntPtr)APPCOMMAND_VOLUME_DOWN : (IntPtr)APPCOMMAND_VOLUME_UP;
int nDiff = (int)Math.Abs(val_c - slider1.Value);
for (int i = 0; i < nDiff; ++i)
{
Win32.Win32.SendMessage(handy, WM_APPCOMMAND, handy, pArg);
}
唯一的另一件事是,您需要知道应用程序启动时的当前音量设置,以便您可以将滑块设置为正确的初始值。
有一个(更复杂的)tutorial here显示了如何做到这一点,尽管在开始时将音量初始设置为某个已知值可能更实用(即设置音量减少100时间确保启动时为零。