2011-01-09 15 views
3

Wie kann ich das aktuelle Master-Volume des Systems in Windows 7 erhalten?Holen Sie sich das aktuelle System-Volume in Windows 7

Ich schaute in Google, aber jede Lösung gab Werte wie -1 oder 4686346 ohne eine klare Erklärung dessen, was sie bedeuten.

+2

Ich schlage vor, lesen Sie Ihre Frage ein und fragen Sie sich - wird jemand meine Frage verstehen und in der Lage sein, sie zu beantworten? http://tinyurl.com/so-hints – Oded

+0

Bitte definieren Sie "aktuellen Sound". Es klingt, als ob Sie eine Lösung gefunden hätten, um diskrete Beispielwerte zurückzugeben - wenn Sie das nicht brauchen, was brauchen Sie? – driis

+0

Ihre Frage ist nicht besonders klar, was das Problem ist. Bitte bearbeiten Sie Ihre Frage erneut und fügen Sie Dinge hinzu wie: Was genau, Sie versuchen es zu tun. Welche Dinge haben Sie ausprobiert (ein kurzes Codebeispiel würde helfen oder ein Link zu einer anderen Website, auf dem jemand anderes etwas Ähnliches zeigt). Was hat nicht mit den Dingen funktioniert, die du ausprobiert hast: Was hast du erwartet und was war das Ergebnis? –

Antwort

8

Sie suchen nach dem EndpointVolume API. Dies ist Teil der neuen Audio-APIs, die in Windows Vista veröffentlicht wurden, und mit denen das Master-Volume abgerufen oder festgelegt werden kann.

Diese Aufgabe wird wesentlich dadurch erleichtert, dass Windows-Versionen vor Vista (Windows XP) nicht unterstützt werden müssen, da zwischen diesen Betriebssystemversionen wesentliche Änderungen an der relevanten Infrastruktur vorgenommen wurden. Dies ist wahrscheinlich der Grund, warum die vorhandenen Samples, die Sie ausprobiert haben, nicht richtig funktionieren.

Es gibt eine vollständige verwaltete Wrapper-Bibliothek, die auf CodeProject verfügbar ist: Vista Core Audio API Master Volume Control. Es implementiert wahrscheinlich mehr Funktionen, als Sie benötigen, aber Sie können sich eine Vorstellung davon machen, was Sie tun müssen, um das Master-System-Volume aus Ihrer C# -Anwendung zu ermitteln.

+6

CodeProject Link ist tot. – NateS

8

Ok, für diejenigen, die nach einer Befehlszeile oder C++ Option suchen, hier ist eine Quelle, die die IAudioEndpointVolume API verwendet.

Es stellt sich heraus, gibt es "skalare" Methoden, die gut funktionieren, und gibt eine Zahl von 0 bis 100 (mit Getter und Setter).

Quelle: https://gist.github.com/rdp/8363580

Command line build davon here.

Siehe auch möglicherweise https://stackoverflow.com/a/7550110/32453

+0

Die Ausgabe kann nicht erfasst werden, z. B. mit der Datei "getvol.exe". Die Datei ist leer. Irgendwelche Ideen? – NateS

+0

[Hier] (http://Stackoverflow.com/a/17578048/187883) ist das Problem. Kannst du bitte einen Flush hinzufügen und neu kompilieren? Mein mingw32 kann es nicht erstellen und ich möchte mein funktionierendes mingw32-Setup nicht mit mingw64 spielen. Prost! – NateS

+1

hmm scheint hier zu funktionieren [vista] umgeleitet zu einer Datei, diese hat einen zusätzlichen Flush: https://sourceforge.net/projects/mplayer-edl/files/current_system_volume_vista_plus_flush.exe/download – rogerdpack

4

Da Sie C# als Tag legen, hier ist eine kleine C# Konsole-Anwendung, die es erhält. Es basiert auf der GetMasterVolumeLevelScalar Methode (Vista oder höher).

GetMasterVolumeLevelScalar Die Methode ruft die Master-Lautstärkepegel des der Audiostrom, der die Audio-Endpunktgerät betritt oder verlässt. Der Lautstärkepegel wird als normalisierter, Audio-Tapered-Wert im Bereich von 0,0 bis 1,0 ausgedrückt.

class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(VolumeUtilities.GetMasterVolume()); 
     } 
    } 


    public static class VolumeUtilities 
    { 
     public static float GetMasterVolume() 
     { 
      // get the speakers (1st render + multimedia) device 
      IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); 
      IMMDevice speakers; 
      const int eRender = 0; 
      const int eMultimedia = 1; 
      deviceEnumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, out speakers); 

      object o; 
      speakers.Activate(typeof(IAudioEndpointVolume).GUID, 0, IntPtr.Zero, out o); 
      IAudioEndpointVolume aepv = (IAudioEndpointVolume)o; 
      float volume = aepv.GetMasterVolumeLevelScalar(); 
      Marshal.ReleaseComObject(aepv); 
      Marshal.ReleaseComObject(speakers); 
      Marshal.ReleaseComObject(deviceEnumerator); 
      return volume; 
     } 

     [ComImport] 
     [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] 
     private class MMDeviceEnumerator 
     { 
     } 

     [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
     private interface IAudioEndpointVolume 
     { 
      void _VtblGap1_6(); 
      float GetMasterVolumeLevelScalar(); 
     } 

     [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
     private interface IMMDeviceEnumerator 
     { 
      void _VtblGap1_1(); 

      [PreserveSig] 
      int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice ppDevice); 
     } 

     [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
     private interface IMMDevice 
     { 
      [PreserveSig] 
      int Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface); 
     } 
    } 
+0

Das hat sofort funktioniert. Vielen Dank! – Rich

Verwandte Themen