Zugriff auf die Master Lautstärke über C#
-
Hi!
Ich komme nicht weiter und bräuchte etwas Hilfe. Ich versuche mit C# über die
Windows API die Master Lautstärke von Windows auszulesen.
Dafür habe ich folgenden Code geschrieben:using System; using System.Runtime.InteropServices; namespace VolumeAPI { class Class1 { [DllImport("Winmm.dll")] public static extern int auxGetVolume(long uDeviceID, long lpdwVolume); static void Main(string[] args) { long testVolume = new long(); int retval = auxGetVolume(0,testVolume); System.Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString()); System.Console.WriteLine("Fehlercode: "+retval.ToString()); System.Console.Read(); } } }
Die Konsolenausgabe lautet:
Die Lautstärke ist: 0
Fehlercode: 11Fehlercode 11 bedeutet laut MMSystem.h, dass einer der Parameter von
auxGetVolume ungültig ist.
Was mach ich da falsch????Gruss
-
na was ist z.b. uDeviceID? warum ist sie 0?
hast du mit auxGetNumDevs() geprüft, ob überhsupt was "existiert"? bei mir gibt die funktion immer 0 zurück.
-
auxGetNumDevs() gibt mir 0 zurück, womit bewiesen wäre, dass
auxGetVolume() auf meinen System wohl nicht funktioniert (liegt das
an der Soundkarte? Naja).Also: Strategiewechsel.
Neuer Versuch mit waveOutGetVolume().
Ist zwar nicht das was ich wollte (Ich wollte ja die Gesammtlautstärke),
ist aber als Test OK.
waveOutGetNumDevs() gibt 1 zurück,
es muss also ein Device vorhanden sein. Der neue Code lautet:using System; using System.Runtime.InteropServices; namespace VolumeAPI { class Class1 { [DllImport("Winmm.dll")] public static extern int waveOutGetVolume(long uDeviceID,long lpdwVolume); static void Main(string[] args) { long testVolume = new long(); int retval = waveOutGetVolume(0,testVolume); System.Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString()); System.Console.WriteLine("Fehlercode: "+retval.ToString()); System.Console.Read(); } } }
Ausgabe:
Die Lautstärke ist: 0
Fehlercode: 11Deja vu!
Villeicht ist ja die uDeviceID gar nicht 0. Wie finde ich die raus?
-
Ok, ich geb's ja, zu - Es wird wahrscheinlich keinen mehr interessieren, aber ich hab grad so durch's Forum geschmökert und konnt' nicht anders:
Wildside schrieb:
auxGetNumDevs() gibt mir 0 zurück, womit bewiesen wäre, dass
auxGetVolume() auf meinen System wohl nicht funktioniert (liegt das
an der Soundkarte? Naja).Nö, liegt an deiner Implementierung
Wildside schrieb:
Also: Strategiewechsel.
Hm, Trick 17!?
Wildside schrieb:
using System; using System.Runtime.InteropServices; namespace VolumeAPI { class Class1 { // [DllImport("Winmm.dll")] // public static extern int waveOutGetVolume(long uDeviceID,long lpdwVolume); // Jup, schon, nur... // // Ist waveOutGetVolume in VC++ wie folgt definiert: // // WINMMAPI MMRESULT WINAPI waveOutGetVolume( IN HWAVEOUT hwo, OUT LPDWORD pdwVolume); // // MMRESULT == UINT (32 Bit) ...entsprechung in C#: uint // HWAVEOUT == void * ...hier wurscht, da IN. // Darfst dich hier auf das automatische Marshaling verlassen. // Nur ist ein Device ID ein VC++ UINT (32 Bit) und in // C# wär da ein long (64 Bit, signed) doch ein bisserl übertrieben. %F DWORD == UINT (32 Bit) ...entsprechung in C# uint und kein long // // Daraus und aus der Tatsache, daß pdwVolume als OUT und void* definiert ist, folgt: [DllImport("Winmm.dll")] public static extern uint waveOutGetVolume(uint uDeviceID, ref uint lpdwVolume); static void Main(string[] args) { // long testVolume = new long(); Nö, uint -> uint testVolume = 0; // int retval = waveOutGetVolume(0,testVolume); Nö, uint und ref -> uint retval = waveOutGetVolume(0, ref testVolume); // Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString()); Nö -> // Da bekommst irgendwas, denn: // "The low-order word of this location contains the left-channel volume setting, // and the high-order word contains the right-channel setting." // Also: ushort LeftVolume = (ushort) (testVolume & 0xffff); // low word ushort RightVolume = (ushort) (testVolume >> 16); // high word Console.WriteLine("Linke Lautstärke: " + LeftVolume.ToString()); Console.WriteLine("Rechte Lautstärke: " + RightVolume.ToString()); Console.WriteLine("Fehlercode: "+retval.ToString()); Jup, aber // Davon wirst wohl nicht viel haben, also: switch(retval) { case 5: Console.WriteLine("Ungültiges Handle!"); break; case 6: Console.WriteLine("Kein Gerätetreiber installiert!"); break; case 7: Console.WriteLine("Speicherreservierung fehlgeschlagen!"); break; case 8: Console.WriteLine("Die angeforderte Funktion wird nicht unterstützt!"); break; case 0: Console.WriteLine("Kein Fehler."); break; } System.Console.Read(); } } }
Wildside schrieb:
Ausgabe:
Die Lautstärke ist: 0
Fehlercode: 11Deja vu!
Tja, Fehlercode 11 wär dann MMSYSERR_INVALPARAM (invalid parameter passed) gewesen
Ich hoff jetzt sind alle Klarheiten beseitigt
GreeTz, Swordfish