2012-04-23 18 views
7

Quiero cambiar el volumen del programa (y no master volumen). Tengo el siguiente código en este momento:Cambiar el volumen del programa en 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); 
} 

Esto solo funciona en Win XP, no en Windows 7 (y probablemente tampoco en Vista). No he encontrado ningún script que logre lo mismo en Win 7, solo para cambiar el volumen maestro (que no estoy buscando).

Respuesta

6

Su código funcionó bien para mí (con un par de ajustes). Aquí está el código de una manera muy sencilla aplicación de prueba de WPF que se ejecutan en Windows 7 x64:

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

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

Cuando comienzo a la aplicación y mueva el control deslizante, a continuación, un volumen adicional el control aparece en el 'Mezclador de volumen' que se mueve de min a max sincrónicamente con el control deslizante.

Debe examinar el valor de retorno de waveOutSetVolume. Puede darte una pista si tu código aún no funciona.

+0

Estoy usando este código: http://pastebin.com/RcRjfBu4 sin embargo, la depuración me da '0'. El volumen tampoco cambia. – Devator

+0

Retval = 0 significa éxito, así que no hubo suerte allí. Como dije, funciona para mí. Supongo que tienes Win7 SP1. También tengo VS11 beta instalado, que puede haber arreglado algo. – Phil

+0

Ok, puedo confirmar que está funcionando (solo la mitad). Al deslizar el control deslizante, veo que cambia el volumen (solo visual) - eche un vistazo a http://dl.dropbox.com/u/6166898/slider.png. ¡Pero el volumen ** no ** ha cambiado! Cuando deslizo manualmente el control deslizante de volumen de Windows ** cambia **, pero no desde el programa. ¿Me estoy perdiendo de algo? – Devator

1

Puede usar las API de la sesión de audio IAudioVolume y IAudioSessionNotification para modificar el volumen actual de las aplicaciones y realizar un seguimiento de su volumen con el deslizador de volumen en la aplicación.

se puede encontrar una lista de ejemplos de su uso en Larry Osterman's blog article

La forma más fácil de usar es la interfaz ISimpleVolume. Se discute en Larry's blog también.

Cuestiones relacionadas