Lautstärke auf 100% mit einem Klick

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Heinrich.

    Lautstärke auf 100% mit einem Klick

    Hallo miteinander

    Visual Basic 2008: In Sprachübungen sollen Schüler fremde Stimmen abhören und die eigene Stimme aufnehmen und abhören können. Das "Windows volume" wird vor dem Start der Anwendung auf höchstens 30% gestellt, da sonst der Sound des System und der Wave-Dateien zu laut ist. Zum Abhören der eigenen Stimme sind 30% jedoch viel zu leise. Es müssten wieder 100% sein. In

    Lautstärke von Windows verändern

    habe ich einen guten Code von "SeriTools" und "ChaosBernd" gefunden, allerdings wird nur in Stufen von 2% oder mit Schieber verändert. Wie kann die Lautstärke mit einem einzigen Klick auf 100% gesetzt werden und umgekehrt? Bei Play: Wenn < als 100, dann 100. Beim Schliessen des Recorders: wenn 100, dann 30.

    Vorbild: Für die Sprachkurse "First Class" (edition-firstclass.de) genügen 10% der Windows-Lautstärke, die Wiedergabe ist einwandfrei, sowohl die der eigenen Stimme als auch jene der eingespielten Wave-Dateien. Sogar die Spracherkennung ist dort gut. (Auf diese kann ich verzichten.)

    Um Hilfe bin ich sehr dankbar!

    Gruss
    Peter

    *Topic verschoben*

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

    Hallo EddyWhat a inscrutable World, the Computer World.
    Danke für deinen Link! Leider bin ich mit meinen Computerkenntnissen und mit meinem Englisch überfordert. Der Link verzweigt sich schier ins Unendliche, ich weiss nicht, wo ich anfangen soll und ob ich mit den Hinweisen je eine Lösung zustande bringen werde. Ist der der folgende Weg zumindest der richtige?
    github.com/vannatech/netcoreau…n/Vannatech.CoreAudio.xml
    Gruss
    Peter
    Eigendlich brauchst du die DLL.

    Fuer die Vannatech-DLL habe ich kein Beispiel parat, im Anhang ist VB.Net-Variante um die CoreAudioAPI zu wrappen. Erstelle dir die DLL, fuege einen Verweis auf die DLL hinzu, so funktioniert das dann.

    VB.NET-Quellcode

    1. Imports WindowsAudio.Audio
    2. Public Class Form1
    3. Private Devices As MMDeviceCollection
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Devices = (New MMDeviceEnumerator().EnumerateAudioEndPoints(EDataFlow.eRender, EDeviceState.DEVICE_STATE_ACTIVE))
    6. Dim y As Integer = 6
    7. If Devices.Count > 0 Then
    8. TrackBar1.Value = CInt(Devices(0).AudioEndpointVolume.MasterVolumeLevelScalar * 100.0F)
    9. AddHandler Devices(0).AudioEndpointVolume.OnVolumeNotification, New AudioEndpointVolumeNotificationDelegate(AddressOf AudioEndpointVolume_OnVolumeNotification)
    10. End If
    11. End Sub
    12. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    13. If Devices.Count > 0 Then
    14. Devices(0).AudioEndpointVolume.MasterVolumeLevelScalar = TrackBar1.Value / 100.0F
    15. End If
    16. End Sub
    17. Private Sub AudioEndpointVolume_OnVolumeNotification(ByVal data As AudioVolumeNotificationData)
    18. If InvokeRequired Then
    19. Invoke(New AudioEndpointVolumeNotificationDelegate(AddressOf AudioEndpointVolume_OnVolumeNotification), data)
    20. Else
    21. TrackBar1.Value = CInt(data.MasterVolume * 100.0F)
    22. End If
    23. End Sub
    24. End Class

    Dateien
    • WindowsAudio.zip

      (43,68 kB, 136 mal heruntergeladen, zuletzt: )
    And i think to myself... what a wonderfuL World!

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

    Hallo EddyVielen Dank für die Bereitstellung des Code und für die Hinweise!
    Das Bild in deiner Adresse dürfte einem Zauberer gleichen, während ich nicht einmal ein Zauberlehrling bin. Ich habe keine Ahnung, wie ich eine dll erstelle. Lange Zeit habe ich meine Anwendungen mit Übungen gefüllt und kaum Fortschritte gemacht im Entwickeln. Nun habe ich begonnen, mich in das Entwicklerbuch von K. Löffelmann zu vertiefen, allerdings reicht es betreffend dll noch nirgends hin.
    Kannst du mir einen Tipp geben, wo ich die notwendige dll finde? Vielen Dank.
    Gruss
    Peter
    Hallo miteinander
    Da ich Eddys Code nicht ausführen kann, habe ich in anderen Threads weiter nach Code gesucht, mit Erfolg und beinahe wunschlos! Der VB.NET-Quellcode steht hier dabei, sofern das Einfügen klappt. Andernfalls ist der Teil betr. ScrollBar im Thread "Lautstärke von Windows verändern" vorhanden. Vielen Dank für die verschiedenen Beiträge!
    Nur das Tüpfchen auf dem i fehlt noch: In den Anwendungen wird bei jedem Klick kurz ein ScrollBar (TrackBar?) eingeblendet (Wave abhören 30%, eigene Stimme 100%), also unzählige Male. Wie kann man es unsichtbar machen? All mein Knobeln hilft nichts.

    Vielen Dank für eine Anleitung!

    Gruss
    Peter


    Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'aus: [url='http://www.vb-paradise.de/index.php/Thread/46876-lautstaerke-von-windows-veraendern/#post352289']Lautstärke von Windows verändern[/url]
    2. 'siehe auch [url='https://www.vb-paradise.de/index.php/Thread/120823-Lautstrke-auf-100-mit-einem-Klick/']Lautstärke auf 100% mit einem Klick[/url]
    3. 'Ratschläge von "ChaosBernd" und "SeriTools" .
    4. 'Zu diesem Code braucht es eine Form und darin Button1, 2, 3 und 4.
    5. 'Der folgende erste Teil kann in ein Modul gesetzt werden.
    6. Imports System.Runtime.InteropServices
    7. Public Class Lautstaerke 'muss wie die eigene Class heissen, z.B. Form1 oder Modul1.
    8. Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal Command As String, _
    9. ByVal ReturnString As String, ByVal ReturnLength As Integer, ByVal Callback As Integer) As Integer
    10. <Runtime.InteropServices.DllImport("user32.dll", CallingConvention:=CallingConvention.StdCall, _
    11. CharSet:=CharSet.Unicode, EntryPoint:="keybd_event", _
    12. ExactSpelling:=True, SetLastError:=True)> _
    13. Public Shared Function keybd_event(ByVal bVk As Int32, ByVal bScan As Int32, _
    14. ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32) As Boolean
    15. End Function
    16. 'Windows Zugriff
    17. Private Declare Sub keybd_event Lib "user32" _
    18. (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    19. Const KEYEVENTF_KEYDOWN As Integer = 0
    20. Const KEYEVENTF_KEYUP As Integer = 2
    21. ' Lauter
    22. Public Shared Sub Lauter()
    23. Dim index As Integer = 0
    24. Do
    25. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYDOWN, 0)
    26. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
    27. index += 1
    28. Loop Until index > 50 'damit erreicht der System-Lautsprecher in jedem Fall 100%
    29. End Sub
    30. ' Leiser
    31. Public Shared Sub Leiser()
    32. Dim index As Integer = 0
    33. Do
    34. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYDOWN, 0) ' Taste runter
    35. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0) ' Taste rauf
    36. index += 1
    37. Loop Until index > 34 'der Systemlautsprecher wird von 100% auf 30% gestellt.
    38. End Sub
    39. ' Stumm
    40. Public Shared Sub Stumm()
    41. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeMute), 0, KEYEVENTF_KEYDOWN, 0)
    42. Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeMute), 0, KEYEVENTF_KEYUP, 0)
    43. End Sub
    44. 'Folgendes im Code der Form
    45. #Region "Systemlautstrke"
    46. ' Lauter
    47. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    48. Lautstaerke.Lauter()
    49. End Sub
    50. ' Leiser
    51. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    52. Lautstaerke.Leiser()
    53. End Sub
    54. ' Stumm (sofern man dies braucht)
    55. Private Sub Button3_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    56. Lautstaerke.Stumm()
    57. End Sub
    58. #End Region
    59. ' Zur Kontrolle eine Wave-Datei in den Resources.
    60. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    61. My.Computer.Audio.Play(My.Resources.pappagallo, AudioPlayMode.Background)
    62. End Sub
    63. End Class



    Editiert: Bitte passende Code-Tags verwenden und zu lange Abschnitte als Spolier verbergen. ~fufu

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Heinrich“ ()

    Heinrich schrieb:

    Auf den Klick Erstellen erscheint die Fehlerliste mit 7 Fehlern, die bereits im Code unterwellt sind, der Release-Ordner bleibt leer.


    Hast du etwas in der Projektmappe am Code veraendert? Entpacken, oeffnen, kompilieren, fertig.
    Sonst mal her mit den Meldungen.
    And i think to myself... what a wonderfuL World!
    Hallo Eddy

    Vielen Dank für deine Bemühungen.

    Deine Anleitung habe ich befolgt (mehrmals immer wieder in neuem Ordner). Kompilieren geht der Fehlermeldung wegen nicht.
    1. Entpacken
    (Dabei ist mir aufgefallen, dass kein Windows-Form dabei ist (z.B. Form1)

    2. Öffnen
    Sogleich erscheint eine Fehlerliste, wobei manche Fehler die gleiche Ursache haben, z.B.
    Der Attributspezifizierer ist keine vollständige Anweisung. ...

    Danke für die Geduld und Gruss
    Peter
    Fehlerzeilen waeren hilfreich gewesen. Keine Ahnung was du machst, mit VS2010,2013 und 2015 kompiliert das.

    Heinrich schrieb:

    (Dabei ist mir aufgefallen, dass kein Windows-Form dabei ist (z.B. Form1)


    Soll ja auch nicht. Soll ja etwas wieder nutzbares sein, oder soll ich den Code in jedes Projekt einfuegen anstatt nur einer DLL?. Im Anhang eine kompilierte DLL. Mach ein neues WinForms-Projekt, fuege ein Verweis auf diese DLL hinzu, wirf eine TrackBar auf die Form, setz das Maximum auf 100 und bediene dich am Code oben.
    Dateien
    And i think to myself... what a wonderfuL World!
    In
    Wie dll in ein VB-Projekt einbinden und benutzen

    hat RodFromGermany im Juni 2013 eine Anleitung geschrieben:
    1. Eine DLL in Dein Projekt einbinden:
    kopier sie in Dein bin\Debug und in dein bin\Release Verzeichnis.
    2. Füge sie als Referenz Deinem Projekt hinzu. Projekt -> Eigenschaften -> Verweise -> Hinzufügen
    3. Wenn nun alles in Ordnung ist, importiere im Code den NameSpace der DLL Imports ... (er müsste Dir hier angeboten werden)

    Klicke ich auf Hinzufügen, erscheint die WindowsAudio.dll nicht in bin\Debug und bin\Release. So wähle ich notgedrungen den Projektnamen, der zur Verfügung steht. Den Namen des Projekts "AudioEddy" finde ich in "Importierte Namespaces" und kann ihn dort auch mit einem Häklein versehen. Unter diesem Namen kann ich ihn im Code importieren. Aber offenbar ist die dll in diesem Namespace nicht enthalten und diese Art des Importierens falsch. Wie muss ich vorgehen? Vielen Dank für Hilfe.

    Heinrich schrieb:

    Der Verweis auf die angebotene dll will mir nicht gelingen
    Gugst Du auch hier.
    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!