2012-04-23 16 views
7

पर प्रोग्राम की मात्रा बदलें मैं प्रोग्राम की मात्रा को बदलना चाहता हूं (और मास्टर वॉल्यूम नहीं)। मेरे पास अभी निम्न कोड है:विन 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 पर काम करता है, विंडोज 7 (और शायद Vista नहीं)। मुझे कोई भी स्क्रिप्ट नहीं मिली है जो Win 7 पर प्राप्त होगी, केवल मास्टर वॉल्यूम को बदलने के लिए (जो मैं बाद में नहीं हूं)।

उत्तर

6

आपका कोड मेरे लिए ठीक है (कुछ बदलावों के साथ)।

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> 

सी #

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

जब मैं अनुप्रयोग शुरू करने और स्लाइडर ले जाते हैं, तो एक अतिरिक्त मात्रा: यहाँ एक बहुत ही सरल WPF परीक्षण ऐप को विंडोज 7 x64 पर चलने के लिए कोड है नियंत्रण 'वॉल्यूम मिक्सर' में दिखाई देता है जो स्लाइडर के साथ न्यूनतम से अधिकतम सिंक्रनाइज़ेशन तक चलता है।

आपको waveOutSetVolume से वापसी मूल्य की जांच करनी चाहिए। यदि आपका कोड अभी भी काम नहीं करता है तो यह आपको एक सुराग दे सकता है।

+0

मैं इस कोड का उपयोग कर रहा हूं: http://pastebin.com/RcRjfBu4 हालांकि डीबग मुझे '0' देता है। मात्रा या तो नहीं बदलती है। – Devator

+0

रेटवल = 0 का मतलब सफलता है, इसलिए कोई भाग्य नहीं है। जैसा कि मैंने कहा कि यह मेरे लिए काम करता है। मुझे लगता है कि आपके पास Win7 SP1 है। मेरे पास वीएस 11 बीटा भी स्थापित है - जो कुछ तय कर सकता है। – Phil

+0

ठीक है, मैं पुष्टि कर सकता हूं कि यह काम कर रहा है (केवल आधा हालांकि)। स्लाइडर को स्लाइड करते समय मुझे वॉल्यूम बदलना दिखाई देता है (केवल विज़ुअल वार) - http://dl.dropbox.com/u/6166898/slider.png पर एक नज़र डालें। लेकिन वॉल्यूम ** ** नहीं बदला गया है! जब मैं मैन्युअल रूप से विंडोज वॉल्यूम स्लाइडर स्लाइड करता हूं तो ** ** ** बदलता है, लेकिन प्रोग्राम के भीतर से नहीं। क्या मुझसे कोई चूक हो रही है? – Devator

1

आप मौजूदा ऐप वॉल्यूम को संशोधित करने और ऐप में वॉल्यूम स्लाइडर के साथ अपनी वॉल्यूम को ट्रैक करने के लिए ऑडियो सत्र एपीआई IAudioVolume और IAudioSessionNotification का उपयोग कर सकते हैं।

आप में उनके उपयोग के नमूनों की एक सूची पा सकते हैं Larry Osterman's blog article

सबसे आसान उपयोग करने के लिए ISimpleVolume इंटरफेस है। इस पर Larry's blog में भी चर्चा की गई है।