Status Lautsprecher

04/04/2013 - 15:37 von Lothar Geyer | Report spam
Ich möchte mit meinem VB6-Programm anzeigen, ob der/die Lautsprecher
intern/extern eingeschaltet sind. Bei den externen wird es da wohl
Probleme geben. Aber zumindest sollte abfragbar sein, ob die Soundkarte
überhaupt "eingeschaltet" ist.

Ich habe aber im Netz nichts Brauchbares gefunden. (Wahrscheinlich bloß
wieder nach dem Falschen gesucht.)

Hat bitte jemand einen Link oder auch eine Lösung für mich?

Danke.

Lothar Geyer
 

Lesen sie die antworten

#1 Schmidt
04/04/2013 - 19:24 | Warnen spam
Am 04.04.2013 15:37, schrieb Lothar Geyer:
Ich möchte mit meinem VB6-Programm anzeigen, ob der/die Lautsprecher
intern/extern eingeschaltet sind. Bei den externen wird es da wohl
Probleme geben. Aber zumindest sollte abfragbar sein, ob die Soundkarte
überhaupt "eingeschaltet" ist.

Ich habe aber im Netz nichts Brauchbares gefunden. (Wahrscheinlich bloß
wieder nach dem Falschen gesucht.)



Bei Systemen ab Vista geht das mittels CoreAudio relativ einfach -
also ob ein EndPunkt-Device (eine "Buchse" sozusagen) hardware-
seitig "ein Kabel stecken hat" - und natürlich auch, ob irgendwelche
Software-Switches (Mute- oder Volume-Regler) auf dem Weg (bzw. Pfad)
hin zu Deiner eigenen SoundApp noch eine Unterbrechung verursachen.

Der Weg für Systeme vor Vista funktioniert dann eher so wie z.B. hier
beschrieben:



http://msdn.microsoft.com/de-de/lib...p/dd370793(v=vs.85).aspx

Neue Klassen für CoreAudio-support sind jetzt im neuen
RichClient5 enthalten, den man hier downloaden kann:
www.vbRichClient.com/Downloads/vbRC5BaseDlls.zip (2.2MB)


Eine einfache Enumeration gegen eine ListBox geht mit den
neuen CoreAudio-Klassen z.B. so:

'Diesen Einstiegspunkt braucht man nur einmal pro App ...
'also am besten in einem *.bas Modul deklarieren
Public DevEnm As cMMDeviceEnumerator

'irgendwo in der Startup-Phase der App die Instanz erzeugen
Set DevEnm = New cMMDeviceEnumerator


Damit kann man dann z.B. sofort direkt (ohne Enumeration)
an die aktuellen Default-Devices gelangen per:
'z.B. das aktuelle OutPut-Device
DevEnm.GetDefaultAudioEndpoint(eRender, eConsole)

'oder das aktuelle Input-Device
DevEnm.GetDefaultAudioEndpoint(eCapture, eConsole)

'oder auch das aktuelle Input-Device für Kommunik.-Zwecke
DevEnm.GetDefaultAudioEndpoint(eCapture, eCommunications)



' volle Enumeration dann z.B. in einer Form-Listbox -


'auf Form-Level, um spàter über den ListIndex auf konkrete
'Devices zugreifen zu können
Private DevCol As cMMDeviceCollection

Private Sub Form_Load()
'eine entspr. cMMDeviceCollection-Instanz erzeugen
'(in dem Falle mit dem Filter: "alle Devices, alle States")
Set DevCol = DevEnm.EnumAudioEndpoints(eAll, DEVICE_STATEMASK_ALL)
End Sub

'ListBox füllen mit den Endpunkten und deren States:
Public Sub EnumEndPoints()
Dim i As Long, Dev As cMMDevice

Lst.Clear

For i = 0 To DevCol.GetCount - 1
Set Dev = DevCol.Item(i)

With Dev.OpenPropertyStore
'different Infos into the List-Item-Caption
Lst.AddItem .GetEndPointFormFactorName & ", "& Dev.GetStateName _
& ", "& .GetCount &", " &.GetDevice_FriendlyName

'in ItemData we can store for example the DevIcon-Resource-ID
Dim PropKey() As Long
PropKey = .GetPropKeyByName("DEVPKEY_DeviceClass_IconPath")
Lst.ItemData(List1.NewIndex) = Split(.GetValue(PropKey), ",-")(1)
End With
Next i
End Sub

'im Click-Event der ListBox können wir z.B. das zugeh. Icon anzeigen
'aber auch das aktuelle, konkrete Device bestimmen
Private Sub Lst_Click()
Dim ResIconID As Long, Srf As cCairoSurface
If Lst.ListIndex < 0 Then Exit Sub
ResIconID = Lst.ItemData(Lst.ListIndex)
If ResIconID = 0 Then Exit Sub
With New_c.Cairo
Set Srf = .ImageList.AddIconFromResourceFile( _
"mmres" & ResIconID, "mmres.dll", ResIconID)
Srf.DrawToDC Me.hDC
End With
Set CurDev = DevCol.Item(Lst.ListIndex)
End Sub

Olaf

Ähnliche fragen