3

フォームにスライダーと webbrowser オブジェクトがあり、スライドすると音量が変わるはずですが、ここに示すようにスライダーが移動します。スライダーは動きますが、音の出力は変わりません

ただし、ボリュームの実際の出力は変更されません。これはおそらく、WebBrowser オブジェクトを統合し、Windows 7 を使用しているためです。スライダー (スクリーンショットに表示されているもの) を手動でスライドすると、音量出力変化します。.wav ファイルを再生すると、ボリュームの出力変化しますが、WebBrowser オブジェクトでは変化しません。

私は次のコードを使用しています:

Xaml

<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);
    }
}

static class NativeMethods
{
    [DllImport("winmm.dll", EntryPoint = "waveOutSetVolume")]
    public static extern int WaveOutSetVolume(IntPtr hwo, uint dwVolume);

}
4

2 に答える 2

2

MediaElementを使用してみてください。

次に、次のようにラジオ局を再生できます。

<MediaElement LoadedBehavior="Manual" x:Name="media" />

media.Source = new Uri(@"http://shoutcastinfo.radiostaddenhaag.com/stad.wax");
media.Play();

そして音量を変えて

<Slider Minimum="0" Maximum="1" ValueChanged="ValueChanged"/>

private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    media.Volume = e.NewValue;
}

Windows Mixer と WPF スライダーの両方が適切に音量を変更するようになりましたが、2 つの値は独立しており、互いの変更を反映しません。

于 2012-05-01T16:58:16.257 に答える
1

まず第一に、これuint v = ((uint)newVolume) & 0xffffは少し冗長でuint v = (uint)newVolume、同じ結果を返します。

次に、waveOutSetVolume メソッドの MSDN ドキュメントによると、次のようになります。

ほとんどのデバイスは、ボリューム レベル コントロールの完全な 16 ビットをサポートしておらず、要求されたボリューム設定の最下位ビットを使用しません。たとえば、デバイスが 4 ビットのボリューム コントロールをサポートしている場合、値 0x4000、0x4FFF、および 0x43BE はすべて 0x4000 に切り捨てられます。waveOutGetVolume 関数は、waveOutSetVolume で設定された完全な 16 ビット設定を返します。

大きな変更を試みましたか?

于 2012-05-06T17:32:31.320 に答える