VB.Net Lautstärke von Programmen regeln

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Silvergreen.

    VB.Net Lautstärke von Programmen regeln

    Moin Community,
    ich habe das ganze Netz auf den Kopf gestellt, nur entweder ist es nicht möglich, oder ich bin blind oder so :D. Unter Windows kann man ja ganz easy sehen welches Programm Sound abspielt und diesen zu regeln ist ja auch kein Hexenwerk. Jetzt würde ich gerne die Lautstärke eines bestimmten Programmes regeln und das mit meiner Anwendung. Optional: Meine Anwendung zeigt alle Anwendungen an, welche einen Sound abspielen, wenn jemand weiß wie das geht wäre ich sehr dankbar.
    Bei Fragen stehe ich natürlich gerne zur verfügung
    Mfg Marco

    *Topic verschoben*
    ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Natürlich ist das Ganze möglich allerdings nicht ganz so einfach wie du es dir wahrscheinlich erhofft hast.
    Folgendes sieht vielversprechend aus:
    stackoverflow.com/questions/20…m_campaign=google_rich_qa
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Gather schrieb:

    Natürlich ist das Ganze möglich allerdings nicht ganz so einfach wie du es dir wahrscheinlich erhofft hast.

    Ja, das habe ich mir schon gedacht ;). Ich versuche mich da mal, vielen Dank für den Link

    Bluespide schrieb:


    Ich glaube da muss ich mal mehrere Blicke drauf werfen, einmal hat da nicht gereicht um da Potenzial zu entdecken. Aber zuerst schau ich mir das von Gather mal genauer an.
    ?(

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Silvergreen“ ()

    Ich hab auch noch ein Beispiel gefunden, als ich sowas in der Art mal versucht habe. Bekommst du das übersetzt?:

    C#-Quellcode

    1. using (MMDeviceEnumerator mmde = new MMDeviceEnumerator()) {
    2. using (AudioSessionManager2 asm2 = AudioSessionManager2.FromMMDevice(mmde.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia))) {
    3. foreach (AudioSessionControl asc in asm2.GetSessionEnumerator()) {
    4. string name = asc.DisplayName;
    5. if (String.IsNullOrWhiteSpace(name)) {
    6. using (AudioSessionControl2 asc2 = asc.QueryInterface<AudioSessionControl2>()) {
    7. name = asc2.Process.MainWindowTitle;
    8. if (String.IsNullOrWhiteSpace(name)) {
    9. name = asc2.Process.MainModule.FileVersionInfo.FileDescription;
    10. }
    11. }
    12. }
    13. using (SimpleAudioVolume sav = asc.QueryInterface<SimpleAudioVolume>())
    14. Console.WriteLine(name + " " + sav.MasterVolume.ToString("p"));
    15. }
    16. }
    17. }
    Den Code der im Link von @Gather enthalten ist ist sehr komplex un in c#. Ich habe mal weiter gesucht und ihn in vb.net gefunden. Hier mal der Code
    Spoiler anzeigen
    https://pastebin.com/WSENqQX5
    Seite meckert zu viele Zeichen, waren doch nur 44000 ;)


    Wenn jemand etwas damit anfangen kann, bitte sehr :D. Mir ist das momentan viel zu viel.. und dann noch bei dieser Hitze... Ich mach da mal ne pause
    ?(
    Soooo hab mich hingesetzt und das Ganze für dich Rasch in vb.NET zusammengebastelt, da es mich selbst interessiert hat :)
    Es basiert wie gesagt auf dem oben verlinktem Code.

    VolumeMixer Klasse

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. ''' <summary>
    3. ''' Stellt Funktionen zum Festlegen der Lautstärke bestimmter Anwendungen bereit.
    4. ''' </summary>
    5. ''' <Source>https://stackoverflow.com/questions/20938934/controlling-applications-volume-by-process-id?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa</Source>
    6. ''' <EditedBy>Gather (vb-paradise.de)</EditedBy>
    7. Public Class VolumeMixer
    8. Public Shared Function GetApplicationVolume(ByVal pid As Integer) As Single?
    9. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    10. If volume Is Nothing Then Return Nothing
    11. Dim level As Single
    12. volume.GetMasterVolume(level)
    13. Marshal.ReleaseComObject(volume)
    14. Return level * 100
    15. End Function
    16. Public Shared Function GetApplicationMute(ByVal pid As Integer) As Boolean?
    17. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    18. If volume Is Nothing Then Return Nothing
    19. Dim mute As Boolean
    20. volume.GetMute(mute)
    21. Marshal.ReleaseComObject(volume)
    22. Return mute
    23. End Function
    24. Public Shared Sub SetApplicationVolume(ByVal pid As Integer, ByVal level As Single)
    25. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    26. If volume Is Nothing Then Return
    27. Dim guid As Guid = Guid.Empty
    28. volume.SetMasterVolume(level / 100, guid)
    29. Marshal.ReleaseComObject(volume)
    30. End Sub
    31. Public Shared Sub SetApplicationMute(ByVal pid As Integer, ByVal mute As Boolean)
    32. Dim volume As ISimpleAudioVolume = GetVolumeObject(pid)
    33. If volume Is Nothing Then Return
    34. Dim guid As Guid = Guid.Empty
    35. volume.SetMute(mute, guid)
    36. Marshal.ReleaseComObject(volume)
    37. End Sub
    38. Private Shared Function GetVolumeObject(ByVal pid As Integer) As ISimpleAudioVolume
    39. Dim deviceEnumerator As IMMDeviceEnumerator = CType((New MMDeviceEnumerator()), IMMDeviceEnumerator)
    40. Dim speakers As IMMDevice
    41. deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, speakers)
    42. Dim IID_IAudioSessionManager2 As Guid = GetType(IAudioSessionManager2).GUID
    43. Dim o As Object
    44. speakers.Activate(IID_IAudioSessionManager2, 0, IntPtr.Zero, o)
    45. Dim mgr As IAudioSessionManager2 = CType(o, IAudioSessionManager2)
    46. Dim sessionEnumerator As IAudioSessionEnumerator
    47. mgr.GetSessionEnumerator(sessionEnumerator)
    48. Dim count As Integer
    49. sessionEnumerator.GetCount(count)
    50. Dim volumeControl As ISimpleAudioVolume = Nothing
    51. For i As Integer = 0 To count - 1
    52. Dim ctl As IAudioSessionControl2
    53. sessionEnumerator.GetSession(i, ctl)
    54. Dim cpid As Integer
    55. ctl.GetProcessId(cpid)
    56. If cpid = pid Then
    57. volumeControl = TryCast(ctl, ISimpleAudioVolume)
    58. Exit For
    59. End If
    60. Marshal.ReleaseComObject(ctl)
    61. Next
    62. Marshal.ReleaseComObject(sessionEnumerator)
    63. Marshal.ReleaseComObject(mgr)
    64. Marshal.ReleaseComObject(speakers)
    65. Marshal.ReleaseComObject(deviceEnumerator)
    66. Return volumeControl
    67. End Function
    68. End Class
    69. <ComImport>
    70. <Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")>
    71. Friend Class MMDeviceEnumerator
    72. End Class
    73. Friend Enum EDataFlow
    74. eRender
    75. eCapture
    76. eAll
    77. EDataFlow_enum_count
    78. End Enum
    79. Friend Enum ERole
    80. eConsole
    81. eMultimedia
    82. eCommunications
    83. ERole_enum_count
    84. End Enum
    85. <Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    86. Friend Interface IMMDeviceEnumerator
    87. Function NotImpl1() As Integer
    88. <PreserveSig>
    89. Function GetDefaultAudioEndpoint(ByVal dataFlow As EDataFlow, ByVal role As ERole, <Out> ByRef ppDevice As IMMDevice) As Integer
    90. End Interface
    91. <Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    92. Friend Interface IMMDevice
    93. <PreserveSig>
    94. Function Activate(ByRef iid As Guid, ByVal dwClsCtx As Integer, ByVal pActivationParams As IntPtr, <Out>
    95. <MarshalAs(UnmanagedType.IUnknown)> ByRef ppInterface As Object) As Integer
    96. End Interface
    97. <Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    98. Friend Interface IAudioSessionManager2
    99. Function NotImpl1() As Integer
    100. Function NotImpl2() As Integer
    101. <PreserveSig>
    102. Function GetSessionEnumerator(<Out> ByRef SessionEnum As IAudioSessionEnumerator) As Integer
    103. End Interface
    104. <Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    105. Friend Interface IAudioSessionEnumerator
    106. <PreserveSig>
    107. Function GetCount(<Out> ByRef SessionCount As Integer) As Integer
    108. <PreserveSig>
    109. Function GetSession(ByVal SessionCount As Integer, <Out> ByRef Session As IAudioSessionControl2) As Integer
    110. End Interface
    111. <Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    112. Friend Interface ISimpleAudioVolume
    113. <PreserveSig>
    114. Function SetMasterVolume(ByVal fLevel As Single, ByRef EventContext As Guid) As Integer
    115. <PreserveSig>
    116. Function GetMasterVolume(<Out> ByRef pfLevel As Single) As Integer
    117. <PreserveSig>
    118. Function SetMute(ByVal bMute As Boolean, ByRef EventContext As Guid) As Integer
    119. <PreserveSig>
    120. Function GetMute(<Out> ByRef pbMute As Boolean) As Integer
    121. End Interface
    122. <Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    123. Friend Interface IAudioSessionControl2
    124. <PreserveSig>
    125. Function NotImpl0() As Integer
    126. <PreserveSig>
    127. Function GetDisplayName(<Out>
    128. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    129. <PreserveSig>
    130. Function SetDisplayName(
    131. <MarshalAs(UnmanagedType.LPWStr)> ByVal Value As String,
    132. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    133. <PreserveSig>
    134. Function GetIconPath(<Out>
    135. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    136. <PreserveSig>
    137. Function SetIconPath(
    138. <MarshalAs(UnmanagedType.LPWStr)> ByVal Value As String,
    139. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    140. <PreserveSig>
    141. Function GetGroupingParam(<Out> ByRef pRetVal As Guid) As Integer
    142. <PreserveSig>
    143. Function SetGroupingParam(
    144. <MarshalAs(UnmanagedType.LPStruct)> ByVal Override As Guid,
    145. <MarshalAs(UnmanagedType.LPStruct)> ByVal EventContext As Guid) As Integer
    146. <PreserveSig>
    147. Function NotImpl1() As Integer
    148. <PreserveSig>
    149. Function NotImpl2() As Integer
    150. <PreserveSig>
    151. Function GetSessionIdentifier(<Out>
    152. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    153. <PreserveSig>
    154. Function GetSessionInstanceIdentifier(<Out>
    155. <MarshalAs(UnmanagedType.LPWStr)> ByRef pRetVal As String) As Integer
    156. <PreserveSig>
    157. Function GetProcessId(<Out> ByRef pRetVal As Integer) As Integer
    158. <PreserveSig>
    159. Function IsSystemSoundsSession() As Integer
    160. <PreserveSig>
    161. Function SetDuckingPreference(ByVal optOut As Boolean) As Integer
    162. End Interface


    Um nun die Lautstärke einer bestimmten Anwendung zu ändern, kannst du dir eine simple Methode wie folgende zusammenbasteln:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Setzt die Lautstärke einer bestimmten Anwendung mit gegebenem Prozessnamen.
    3. ''' </summary>
    4. ''' <param name="processName">Name des Prozesses.</param>
    5. ''' <param name="volume">Die gewünschte Lautstärke.</param>
    6. Private Sub SetApplicationSound(processName As String, volume As Single)
    7. Dim p() As Process = Process.GetProcessesByName(processName)
    8. If p.Count > 0 Then
    9. Dim pID As Integer = p(0).Id
    10. If pID = 0 Then Return
    11. VolumeMixer.SetApplicationVolume(pID, volume)
    12. End If
    13. End Sub
    14. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    15. SetApplicationSound("vlc", 10.0F)
    16. End Sub


    Ich habs getestet, es funktioniert!
    Liebe Grüße, Gather
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Gather schrieb:


    Ich habs getestet, es funktioniert!

    Vielen Vielen Dank,
    habe es gerade ausprobiert und es funktioniert super. Nur wie seh ich denn wie ein Prozess genau heißt, bzw diese pID. Mit "vlc" hat es funktioniert. Mit "spotify" nicht. Vielleicht löse ich es auch noch selbständig, aber das würde mich noch interessieren.
    Edit: Ah ok, ich muss den Programmnamen eingeben und die Anwendung stellt dann die pID zusammen. Ich verstehe...
    Bei Chrome das gleiche. Die pID wird erstellt und der Code läuft durch. Allerdings passiert nichts mit der Lautstärke.
    Mfg Marco
    ?(

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

    Was genau ist nun dein Ziel? Möchtest du die Lautstärke einer bestimmten Anwendung verändern? Oder die deiner Eigenen?

    Edit:// @Silvergreen:
    Was chrome betrifft, beziehungsweise Webbrowser generell:
    Wenn du dir diese im Taskmanager ansiehst, bemerkst du, dass diese meist mehrere Prozesse besitzen.
    Wie kannst du also nun sicherstellen, dass du den richtigen modifizierst?
    Ich habe es ganz einfach gelöst in dem ich mit einer Schleife einfach alle verändere:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Setzt die Lautstärke einer bestimmten Anwendung mit gegebenem Prozessnamen.
    3. ''' </summary>
    4. ''' <param name="processName">Name des Prozesses.</param>
    5. ''' <param name="volume">Die gewünschte Lautstärke.</param>
    6. Private Sub SetApplicationSound(processName As String, volume As Single)
    7. Dim p() As Process = Process.GetProcessesByName(processName)
    8. If p.Count > 0 Then
    9. For Each proc In p
    10. Dim pID As Integer = proc.Id
    11. If pID = 0 Then Return
    12. VolumeMixer.SetApplicationVolume(pID, volume)
    13. Next
    14. End If
    15. End Sub


    Außerdem, - bitte nicht falsch verstehen, ich bettle hier keineswegs -, möchte ich dich darauf aufmerksam machen, dass es eine "Hilfreich"-Funktion in diesem Forum gibt (unten rechts, unter jedem Post), um anderen Usern zu zeigen, dass bestimmte Antworten praktisch und hilfreich waren :)

    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Gather“ ()

    Zum Regeln von Lautstärken: github.com/filoe/cscore/blob/m…AudioSessionTests.cs#L142
    Zum Auslesen von Details zur Session (Name, etc.): github.com/filoe/cscore/blob/m…AudioSessionTests.cs#L186
    Hier noch ein Beispiel zum Auslesen des Peaks von Prozessen: stackoverflow.com/questions/23…tion-audio-mixer-namepeak

    Damit die Klassen existieren, einfach das CSCore nuget package installieren und CSCore.CoreAudioApi importieren.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Gather schrieb:

    Was genau ist nun dein Ziel? Möchtest du die Lautstärke einer bestimmten Anwendung verändern? Oder die deiner Eigenen?


    Moin Moin, komisch komisch. Ich hatte gestern noch ins Forum geschaut und da war hier keine Benachrichtigung ?( . Naja wie auch immer. Das mit den Sessions war denke ich mal mein Problem. Ich habe es noch nicht ausprobiert, aber es klingt ja absolut logisch, daher vielen dank schon mal (Den Hilfreich Button habe ich auch gefunden ;) )

    thefiloe schrieb:


    Damit die Klassen existieren, einfach das CSCore nuget package installieren und CSCore.CoreAudioApi importieren.


    Ist leider nicht meine Sprache ;) und durch die Hilfe von Gather scheint es auch super zu funktionieren, aber für andere sicher Hilfreich :thumbsup: .
    ?(

    Silvergreen schrieb:


    Ist leider nicht meine Sprache ;) und durch die Hilfe von Gather scheint es auch super zu funktionieren, aber für andere sicher Hilfreich :thumbsup: .


    ​Ich denke mal du bist noch Anfänger und ich zähle mich selbst auch noch als solchen, lädst du dir aber ne Bibliothek runter oder nen Programmteil der einfach funktioniert und bindest den mit in dein Projekt ein, dann ist es völlig Ritze in welcher Sprache das geschrieben ist, Hauptsache es ist .NET. Du musst auch nicht immer zwingend genau wissen wie sowas dann funktioniert, du musst es nur benutzen können (dabei ignoriere ich jetzt Lizenzen, Nutzen für gewerbliche Zwecke usw. völlig).

    ​Weiterhin ist CSharp und VB.NET so ähnlich, dass wenn man das eine halbwegs kann, auch ansatzweise versteht was im anderen geschrieben steht. Beides nutzt nämlich dazu die selben Bibliotheken, die selben Befehle usw., nur eben mit einer anderen Syntax. Siehe weiterführend de.wikipedia.org/wiki/.NET_Fra…#Konzept_und_Bestandteile