System Lautsprecher ausschalten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    System Lautsprecher ausschalten

    Hi,

    Ich möchte den Systemlautsprecher ausschalten. Das geht mit SendMessage recht einfach. So habe ich das programmiert:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger,
    3. ByVal wParam As IntPtr, ByVal lParam As Integer) As IntPtr
    4. End Function
    5. Const WM_APPCOMMAND As UInteger = &H319
    6. Const APPCOMMAND_VOLUME_MUTE As UInteger = &H8
    7. Private Sub cmdLoadspeakerOff_Click(sender As Object, e As EventArgs) Handles cmdLoadspeakerOff.Click
    8. SendMessage(Me.Handle, WM_APPCOMMAND, New IntPtr(&H200EB0), APPCOMMAND_VOLUME_MUTE * &H10000)
    9. End Sub


    Das funzt auch hervorragend. Bis auf eine Kleinigkeit:

    Der Button "toggelt" den Lautsprecher. D.h. Wenn er angeschaltet ist, dann wird er ausgeschaltet (das ist ja auch in Ordnung). Aber wenn der Lautprecher AUSGESCHALTET ist, dann wird er jetzt wieder ANGESCHALTET ! (Das möchte ich nicht haben).

    Gibt es eine Möglichkeit, das "Toggeln" zu unterbinden ? Alternativ würde ich halt eine Möglichkeit suchen, um den Status des Lautsprechers abzufragen, um mir das SendMessage nötigenfalls zu verkneifen.

    Ich hoffe, ich habe mein Problem verständlich machen können.

    LG
    Peter
    @Peter329 Wenn Du Frau Google nach vb.net systemlautsprecher ausschalten fragst, sieht mir der zweite Treffer sehr vielversprechend aus:
    vbarchiv.net/tipps/tipp_1059-p…er-de-und-aktivieren.html
    Bei diesem hier musst Du die Deklaration auf .NET umstellen, => pinvoke.net/
    vbarchiv.net/api/api_auxsetvolume.html
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jau ... Tante Google habe ich schon bemüht, bevor ich hier im Forum aufgeschlagen bin ...

    Die Lösungen haben alle eins gemeinsam ... entweder verstehe ich sie nicht ... oder sie funktionieren nicht ... oder beides ... :)

    Der zweite von dir zitierte Link scheint ja ganz vielversprechend, um den Status des Lautsprechers auszulesen:

    VB.NET-Quellcode

    1. ' Gibt den Wert des Schlüssels aus "Path" zurück
    2. Public Function RegRead(Path As String) As String
    3. Dim ws As Object
    4. On Error GoTo ErrHandler
    5. Set ws = CreateObject("WScript.Shell")
    6. RegRead = ws.RegRead(Path)
    7. Exit Function
    8. ErrHandler:
    9. RegRead = ""
    10. End Function


    Und das liefert die Fehlermeldung:

    Fehler BC30807 Let- und Set-Zuweisungsanweisungen werden nicht mehr unterstützt.

    Und schon bin ich am Ende mit meinem Latein .... :(
    @Peter329 OK, ich seh mir das zu Hause mal an, da kann ich das mit Sound testen.

    VB.NET-Quellcode

    1. On Error GoTo ErrHandler
    Was soll das :?:
    Dafür gibt es doch nen Try/Catch-Block.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also jetzt mischt ihr beiden mich aber auf !

    Ich habe den Source Code aus dem Link kopiert ... dass man das mit dem ErrorHandler in einen Try-Catch Block umschreiben kann, weiß ich auch. Aber das löst die Sache mit dem "SET" doch nicht auf.

    Jetzt befasse ich mich mit einem von euch genannten Link und dann krieg ich dafür noch Prügel ... :)

    LG
    Peter
    @Peter329 Bis jetzt ist Dein Code oben der einzige, der funktioniert. :thumbup:
    Das, was Du da kopiert hast, geht auch nicht, ich hab das mal direkt im RegEdit ausprobiert.
    Ich bin noch auf der Suche.
    Sieh vielleicht mal hier rein: codeproject.com/Articles/11695…t-I-Windows-Mixer-Control
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Peter329 Ich glaube, ich habe eine praktikable Lösung gefunden.
    Bei er Frage nach c# audio steuerung spuckt Frau Google in der 3. Antwort dies aus: stackoverflow.com/questions/13…lly-set-the-system-volume
    Mit Deiner Start-Lösung kommt dann so was raus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger,
    3. ByVal wParam As IntPtr, ByVal lParam As Integer) As IntPtr
    4. End Function
    5. Private Const WM_APPCOMMAND As UInteger = &H319
    6. Private Const APPCOMMAND_VOLUME_MUTE As Integer = &H80000
    7. Private Const APPCOMMAND_VOLUME_DOWN As Integer = &H90000
    8. Private Const APPCOMMAND_VOLUME_UP As Integer = &HA0000
    9. ''' <summary>
    10. ''' Toggle an / aus
    11. ''' </summary>
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. SendMessage(Me.Handle, WM_APPCOMMAND, Me.Handle, APPCOMMAND_VOLUME_MUTE)
    14. End Sub
    15. ''' <summary>
    16. ''' Leiser
    17. ''' </summary>
    18. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    19. SendMessage(Me.Handle, WM_APPCOMMAND, Me.Handle, APPCOMMAND_VOLUME_DOWN)
    20. End Sub
    21. ''' <summary>
    22. ''' Lauter
    23. ''' </summary>
    24. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    25. SendMessage(Me.Handle, WM_APPCOMMAND, Me.Handle, APPCOMMAND_VOLUME_UP)
    26. End Sub


    Wenn Du mehrfach auf "Leiser" klickst, ist der Sound sicher und untogglebar aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    also erst mal ganz herzlichen Dank, dass du dich mit meinem Problem so intensiv beschäftigt hast !

    Offensichtlich ist das mit dem Lautsprecher nicht so einfach zu lösen. Das .Net framework hält da vermutlich keine einfachen Funktionen bereit.

    Bleibt also nur etwa die von dir genannte Umgehung. Die Sache mit dem "lauter / leiser" ist mir auch schon untergekommen. Wenn man etwa "leiser" auführt, wir automatisch der Sound wieder AKTIVERT, wenn er vorher deaktiviert war. Deshalb führe ich jetzt einmal "leiser" aus und dann kann ich den Lautprecher sicher ausschalten. Ich hab die Lösung mal eingestellt, vielleicht könnte das ja andere auch interessieren.

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger,
    3. ByVal wParam As IntPtr, ByVal lParam As Integer) As IntPtr
    4. End Function
    5. Const WM_APPCOMMAND As UInteger = &H319
    6. Const APPCOMMAND_VOLUME_MUTE As UInteger = &H8
    7. Const APPCOMMAND_VOLUME_DOWN As UInteger = &H9
    8. Private Sub MuteLoadspeaker()
    9. SendMessage(Me.Handle, WM_APPCOMMAND, New IntPtr(&H200EB0), APPCOMMAND_VOLUME_DOWN * &H10000)
    10. SendMessage(Me.Handle, WM_APPCOMMAND, New IntPtr(&H200EB0), APPCOMMAND_VOLUME_MUTE * &H10000)
    11. End Sub
    12. Private Sub cmdMuteLoadspeaker_Click(sender As Object, e As EventArgs) Handles cmdMuteLoadspeaker.Click
    13. MuteLoadspeaker()
    14. End Sub


    Die Lösung ist nur beschränkt tauglich (wenn man zwei Lautstärke Regler hat, etwa für Kopfhörer und Lautsprecher, dann ist mir die Wirkungsweise noch nicht so ganz klar) .... aber für meinen Zweck reicht die Lösung. Deshalb "Daumen hoch" .... Problem gelöst :)

    LG
    Peter

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Zunächst einmal ist das ein interessantes Thema und ich hab da noch ne Weile recherchiert und auch eine absolut Top Lösung für Dein Problem gefunden, die Dir aber ggf. nicht gefallen wird, da sie in C# geschrieben ist und eine eigene DLL sein könnte. Dazu msch ich einen Post im Sourcecodeaustausch.
    Zunächst schreib die * &H10000 nicht in den Aufruf, sondern in die Deklaration, wie es in Post #8 steht.
    Ich hab mal mit den nächsten Konstanten gespielt und folgendes experimentell gefunden:

    VB.NET-Quellcode

    1. Private Const _APPCOMMAND_VOLUME_NEXT As Integer = &HB0000 ' Nächster Titel
    2. Private Const _APPCOMMAND_VOLUME_LAST As Integer = &HC0000 ' Letzter Titel
    3. Private Const _APPCOMMAND_VOLUME_RESTART As Integer = &HD0000 ' Restart selber Titel
    4. Private Const _APPCOMMAND_VOLUME_PAUSE As Integer = &HE0000 ' Toggle Play | Pause
    Wie die Konstanten im Original heißen weiß ich nicht, deshalb der führende Unterstrich; einfach mal ausprobieren.
    Dann gibt es mit dieser Deklaration noch eine äquivalente Lösung:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    2. Private Shared Sub keybd_event(bVk As Byte, bScan As Byte, dwFlags As UInteger, dwExtraInfo As Integer)
    3. End Sub
    4. ' ----
    5. keybd_event(CByte(Keys.VolumeUp), 0, 0, 0) ' increase volume
    6. keybd_event(CByte(Keys.VolumeDown), 0, 0, 0) ' increase volume
    7. keybd_event(CByte(Keys.VolumeMute), 0, 0, 0) ' toggle mute
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!