Benutzer mit den meisten Antworten
Lautstärke verändert nicht schrittweise

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- Typ geändert Robert BreitenhoferModerator Donnerstag, 31. Dezember 2009 10:24 Frage
- Typ geändert Robert BreitenhoferModerator Donnerstag, 31. Dezember 2009 10:25 Frage
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- Als Antwort markiert Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:57
-
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- Als Antwort markiert Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:58
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- Als Antwort markiert Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:57
-
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- Als Antwort markiert Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:58
- Tag als Antwort aufgehoben Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:58
-
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- Als Antwort markiert Bernd Schlepütz Donnerstag, 31. Dezember 2009 10:58
-
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
-
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- Bearbeitet Bernd Schlepütz Freitag, 1. Januar 2010 09:48
-
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
-
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 -
Aber um den ScrollBar zu Sysncronisieren, muss man doch den Wert der derzeitigen Lautstärke ermitteln können ?
Hallo Bernd,
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 ?
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 -
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.