none
Lautstärke verändert nicht schrittweise RRS feed

  • Frage

  • Hallo,

    ich habe von Robert vor einiger Zeit folgenden Code bekommen.
    Option Strict On
    Public Class Form1
        ' Windows zugriff
        Private Declare Sub keybd_event Lib "user32" _
            (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        ' Button
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, 0, 0)
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, 0, 0)
        End Sub
    End Class
    Damit kann man direkt den Lautstäre vom System ansprechen. Das geht nur teilweise.
    Wenn ich nun einen der beiden Button drücke. läuft die Lautstärke ohne anzuhalten bis auf Maximum oder halt auf Minimum.
    Wie kann ich den dur die Lautstärke step-en


    danke
    bernd
    Donnerstag, 31. Dezember 2009 07:39

Antworten

  • Hallo Bernd,

    bei mir passiert das nicht, ich habe allerdings die Tasten auch auf der Tastatur.
    Da damit ein Tastendruck simuliert wird mag gegen das Klemmen helfen,
    ein KeyUp zu senden wie es bei keybd_event gezeigt wird:
       Const KEYEVENTF_KEYUP As Integer = 2
       Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, 0, 0)
       Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
    
    
    Gruß Elmar
    Donnerstag, 31. Dezember 2009 10:08
    Beantworter
  • Hallo Bernd,

    Du mußt dann wie gezeigt keybd_event zweimal aufrufen.
    Der erste Aufruf (mit 0) simuliert den Tastendruck,
    der zweite (mit KEYEVENTF_KEYUP) das Loslassen der Taste.

    Gruß Elmar
    Donnerstag, 31. Dezember 2009 10:47
    Beantworter

Alle Antworten

  • Hallo Bernd,

    bei mir passiert das nicht, ich habe allerdings die Tasten auch auf der Tastatur.
    Da damit ein Tastendruck simuliert wird mag gegen das Klemmen helfen,
    ein KeyUp zu senden wie es bei keybd_event gezeigt wird:
       Const KEYEVENTF_KEYUP As Integer = 2
       Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, 0, 0)
       Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
    
    
    Gruß Elmar
    Donnerstag, 31. Dezember 2009 10:08
    Beantworter
  • Hallo Elmar,

    hier mal der ganze Code.
    Option Strict On
    Public Class Form1
        ' Windows zugriff
        Private Declare Sub keybd_event Lib "user32" _
            (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        Const KEYEVENTF_KEYUP As Integer = 2
        ' Button
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        ' trackBar
        Dim oldValue As Integer
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            TrackBar1.Minimum = 0
            TrackBar1.Maximum = 10
            oldValue = 0
        End Sub
        Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
            Dim counter As Integer
            Dim newValue As Integer = TrackBar1.Value
            Dim myDiff As Integer = newValue - oldValue
            For counter = 1 To System.Math.Abs(myDiff) * 5
                If myDiff < 0 Then
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0)
                    Application.DoEvents()
                Else
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
                    Application.DoEvents()
                End If
            Next counter
            oldValue = newValue
        End Sub
    End Class
    bei mir geht es leider nicht. weder über die Button noch über den TrackBar. (Wobei der TrackBar ja Identisch ist)

    danke
    Bernd
    Donnerstag, 31. Dezember 2009 10:41
  • Hallo Bernd,

    Du mußt dann wie gezeigt keybd_event zweimal aufrufen.
    Der erste Aufruf (mit 0) simuliert den Tastendruck,
    der zweite (mit KEYEVENTF_KEYUP) das Loslassen der Taste.

    Gruß Elmar
    Donnerstag, 31. Dezember 2009 10:47
    Beantworter
  • Hallo Elmar,

    sorry,

    Wer lesen kann ist klar im Vorteil.

    ich danke dir

    und trotzdem damit andere es auch sehen.

    Option Strict On
    Public Class Form1
        ' Windows zugriff
        Private Declare Sub keybd_event Lib "user32" _
            (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        Const KEYEVENTF_KEYUP As Integer = 2
        ' Button
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, 0, 0)
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, 0, 0)
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        ' trackBar
        Dim oldValue As Integer
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            TrackBar1.Minimum = 0
            TrackBar1.Maximum = 10
            oldValue = 0
        End Sub
        Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
            Dim counter As Integer
            Dim newValue As Integer = TrackBar1.Value
            Dim myDiff As Integer = newValue - oldValue
            For counter = 1 To System.Math.Abs(myDiff) * 5
                If myDiff < 0 Then
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, 0, 0)
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0)
                    Application.DoEvents()
                Else
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, 0, 0)
                    Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
                    Application.DoEvents()
                End If
            Next counter
            oldValue = newValue
        End Sub
    End Class
    Donnerstag, 31. Dezember 2009 10:57
  • Hallo Bernd,

    schön das es geklappt hat.

    Kleine Anmerkung am Rande:
    Übersichtlicher fände ich es, Du lagerst die keybd_event Aufrufe in eine eigene Prozedur aus.
    Dann hast Du nicht die vielen Dopplungen.

    Gruß Elmar
    Donnerstag, 31. Dezember 2009 14:48
    Beantworter
  • Hallo Elmar,

    ich werde mal eine kleine version basteltn die übersichtlich ist und die man auch hier posten kann,
    die version die oben gezeigt habe ist die, die ich im Netz gefunden habe und wie fast immer fehlerbehaftet.

    Aber um den ScrollBar zu Sysncronisieren, muss man doch den Wert der derzeitigen Lautstärke ermitteln können ?
    Das oben gannnte Beispiel kann ja garnicht korrekt funktionieren !

    weist du wo ich den Wert auslesen kann ?

    und wenn ich einmal dran bin
    weist du wo man den Wert, ob Stum oder nicht Stumm geschaltet, abfragen kann ?


    danke
    Bernd
    Freitag, 1. Januar 2010 08:32
  • Hier schonmla ohne ScollBar

    Option Strict On
    Public Class Form1
        ' Windows zugriff
        Private Declare Sub keybd_event Lib "user32" _
            (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
        Const KEYEVENTF_KEYDOWN As Integer = 0
        Const KEYEVENTF_KEYUP As Integer = 2
        ' Form Load
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ' Hier soll die erste Syscronisierung rein
        End Sub
        ' Lauter
        Private Sub Leiser()
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYDOWN, 0)  ' Taste runter
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeDown), 0, KEYEVENTF_KEYUP, 0)    ' Taste rauf
        End Sub
        ' Leiser
        Private Sub Lauter()
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYDOWN, 0)
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeUp), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        ' Mute
        Private Sub TonAnAus()
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeMute), 0, KEYEVENTF_KEYDOWN, 0)
            Call keybd_event(CByte(System.Windows.Forms.Keys.VolumeMute), 0, KEYEVENTF_KEYUP, 0)
        End Sub
        ' Ton An / Aus
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            TonAnAus()
        End Sub
        ' Button Left
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Leiser()
        End Sub
        ' Button Right
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Lauter()
        End Sub
    End Class
    Freitag, 1. Januar 2010 08:49
  • Hallo Bernd,


    das keyb_event ist letzendlich nur eine (einfache) Krücke,
    da es Tastaturcodes simuliert, wie man sie auf Multimedia-Tastaturen findet -
    ich habe hier z. B. eins von Microsoft.

    Für eine genauere Steurung ist wäre der Zugriff auf das Windows Media API notwendig.
    Einiges findet sich zum Beispiel hier:
    Using P/Invoke to Call Unmanaged APIs from Your Managed Classes

    Gruß Elmar
    Freitag, 1. Januar 2010 17:12
    Beantworter
  • Aber um den ScrollBar zu Sysncronisieren, muss man doch den Wert der derzeitigen Lautstärke ermitteln können ?

    weist du wo ich den Wert auslesen kann ?

    und wenn ich einmal dran bin
    weist du wo man den Wert, ob Stum oder nicht Stumm geschaltet, abfragen kann ?
    Hallo Bernd,

    wenn es darum geht, die aktuelle Lautstärke auszulesen, ist schon etwas mehr Aufwand erforderlich. Dafür kannst Du aber auch auf den "Hack" verzichten, die Lautstärke "auf gut Glück" über die Tastatur zu ändern, denn wenn Du sie auslesen kannst, kannst Du sie auch einstellen.

    Ein technisch nicht gerade schönes Beispiel, aber es dürfte alles drin enthalten sein, was Du benötigst:

    Volume Control VB.Net 2.0
    http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=4684&lngWId=10


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Freitag, 1. Januar 2010 17:27
    Moderator
  • Hallo Thorsten,

    es soll kein Hack werden.
    Ich erarbeite mir gerade ein kleines Tool, in dem ich alle soweit notwendigen sachen einstellen kann.
    Das meiste ist nur für mich, meine Nichtenn Neffen, Frau, Kinder usw. kommen ständig mit neuen Problemen. Der eine hat XP, der andere Vista.
    Ständig suche ich in der Systemsteuerung, wo ich nun was wieder machen muss. Da habe ich keine Lust zu.
    Auserdem wenn ich einmal dran bin, fange ich an neugirig zu werden. und es macht ja auch spass dazu zu lernen.

    So abe nun zur lautstärke.
    Nach langem suchen und auch nach durchsicht deines Beispiel von Planetsourcecode, bin ich zu dem entschluß gekommen.
    Ich brauche garnicht soweit zu manipulieren. Wenn ich die Lautstärke und die Mute Tasten steuern kann reicht es eigentlich.
    Das system zeigt ja dann sowiso die Aktuelen stand der Lautstärke an.


    vielen dank
    Bernd

    PS. wenn das Tool fertig ist setze ich mal einen Link dazu. Für den der es dann mal begutachten möchte.

    Freitag, 1. Januar 2010 17:55