在 Win 7 上更改程序的音量



我想更改程序的音量(而不是音量)。我现在有以下代码:

DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
private void volumeBar_Scroll(object sender, EventArgs e)
{
    // Calculate the volume that's being set
    int NewVolume = ((ushort.MaxValue / 10) * volumeBar.Value);
    // Set the same volume for both the left and the right channels
    uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
    // Set the volume
    waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
}

这仅适用于Win XP,不适用于Windows 7(可能Vista都不适用于)。我还没有找到任何可以在 Win 7 上实现相同效果的脚本,只是为了更改主音量(我不是在追求)。

你的代码对我来说很好用(做了一些调整)。 下面是在 Windows 7 x64 上运行的一个非常简单的 WPF 测试应用的代码:

哈姆勒

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Slider Minimum="0" Maximum="10" ValueChanged="ValueChanged"/>
    </Grid>
</Window>

C#

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        // Calculate the volume that's being set
        double newVolume = ushort.MaxValue * e.NewValue / 10.0;
        uint v = ((uint) newVolume) & 0xffff;
        uint vAll = v | (v << 16);
        // Set the volume
        int retVal = NativeMethods.WaveOutSetVolume(IntPtr.Zero, vAll);
        Debug.WriteLine(retVal);
        bool playRetVal = NativeMethods.PlaySound("tada.wav", IntPtr.Zero, 0x2001);
        Debug.WriteLine(playRetVal);
    }
}
static class NativeMethods
{
    [DllImport("winmm.dll", EntryPoint = "waveOutSetVolume")]
    public static extern int WaveOutSetVolume(IntPtr hwo, uint dwVolume);
    [DllImport("winmm.dll", SetLastError = true)]
    public static extern bool PlaySound(string pszSound, IntPtr hmod, uint fdwSound);
}

当我启动应用程序并移动滑块时,"音量混合器"中会出现一个额外的音量控件,该控件与滑块同步从最小值移动到最大值。

您应该检查 waveOutSetVolume 的返回值。 如果您的代码仍然不起作用,它可能会为您提供线索。

您可以使用音频会话 API IAudioVolume 和 IAudioSessionNotification 来修改当前应用程序音量,并使用应用程序中的音量滑块跟踪音量。

您可以在Larry Osterman的博客文章中找到它们的使用示例列表

最容易使用的是ISimpleVolume接口。拉里的博客中也对此进行了讨论。

相关内容

  • 没有找到相关文章

最新更新