CommandButton mit Shortcut Key verknüpfen

Hallo,

kann man in VB6 einen CommandButton mit einem Shortcut Key verknüpfen?
Also z.B mit der Pfeiltaste.

Danke.

Gruß
Gunter

kann man in VB6 einen CommandButton mit einem Shortcut Key
verknüpfen?
Also z.B mit der Pfeiltaste.

Hi Gunter,

wie rum denn?
Bei Klick auf den CB wird simuliert, daß die pfeiltaste, welche? gedrückt wurde.
Oder durch Drücken einer Pfeiltaste soll das Anklicken des CB simuliert werden?

Hilft dir der Hinweis auf Onkey weiter?

Gruß
Reinhard

Hallo,

kann man in VB6 einen CommandButton mit einem Shortcut Key
verknüpfen?
Also z.B mit der Pfeiltaste.

Pfeiltaste wüsste ich nicht, aber ein Zeichen, das in der Beschriftung vorkommt.

Setze die Eigenschaft Caption mal auf ‚&Start‘. Dann wird Dir Start als Beschriftung gezeigt und ‚Strg & S‘ ist Dein ShortCut.

Gruß Rainer

Hi Reinhard,

durch drücken der Pfeiltaste (oder ALT-Pfeiltaste, oder CTRL-Pfeiltaste) soll das Anklicken des CB simuliert werden.

Gruß
Gunter

Hi Gunter,

wie rum denn?
Bei Klick auf den CB wird simuliert, daß die pfeiltaste,
welche? gedrückt wurde.
Oder durch Drücken einer Pfeiltaste soll das Anklicken des CB
simuliert werden?

Hilft dir der Hinweis auf Onkey weiter?

Gruß
Reinhard

Hallo Rainer,

dein Tipp funktioniert schon mal ganz gut.
Jetzt suche ich bloß noch eine Lösung für die Pfeiltasten.

Gruß
Gunter

Pfeiltaste wüsste ich nicht, aber ein Zeichen, das in der

Beschriftung vorkommt.

Setze die Eigenschaft Caption mal auf ‚&Start‘. Dann wird Dir
Start als Beschriftung gezeigt und ‚Strg &
S‘ ist Dein ShortCut.

Gruß Rainer

Hi Gunter,

dein Tipp funktioniert schon mal ganz gut.
Jetzt suche ich bloß noch eine Lösung für die Pfeiltasten.

das wüsste ich jetzt nicht, wie das gehen soll.

Wie wär’ mit selbst programmieren?

KeyPreview hilft bei den Cursortasten leider nicht, deshalb fällt mir nichts besseres als ein Timer und GetAsyncKeystate ein.

Eventuell hat ja noch Jemand eine bessere Idee.

Gruß Rainer

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Command1\_Click()
 Me.Caption = "OK"
End Sub

Private Sub Form\_Load()
 Timer1.Interval = 100
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 If GetAsyncKeyState(37) Then
 Command1\_Click
 End If
End Sub

Hi Reinhard,

durch drücken der Pfeiltaste (oder ALT-Pfeiltaste, oder
CTRL-Pfeiltaste) soll das Anklicken des CB simuliert werden.

Der Hinweis auf Onkey hilft mir leider nicht.

Gruß
Gunter

Hi Gunter,

wie rum denn?
Bei Klick auf den CB wird simuliert, daß die pfeiltaste,
welche? gedrückt wurde.
Oder durch Drücken einer Pfeiltaste soll das Anklicken des CB
simuliert werden?

Hilft dir der Hinweis auf Onkey weiter?

Gruß
Reinhard

durch drücken der Pfeiltaste (oder ALT-Pfeiltaste, oder
CTRL-Pfeiltaste) soll das Anklicken des CB simuliert werden.

Moin Gunter,

getestet mit VB5.0, eine Form, drei CBs:

Option Explicit
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public intKey As Integer
'
Private Sub Command1\_Click()
Dim Taste, Mldg As String
Taste = Array("links", "hoch", "rechts", "runter")
If intKey \> 0 Then
 Mldg = "Command Button 1 wurde durch" & Chr(13) & Chr(13)
 Mldg = Mldg & "Pfeitaste " & Taste(intKey - 37) & " ausgelöst"
 MsgBox Mldg
End If
End Sub
'
Private Sub Command1\_GotFocus()
Call Pfeil
End Sub
'
Private Sub Command2\_GotFocus()
Call Pfeil
End Sub
'
Private Sub Command3\_GotFocus()
Call Pfeil
End Sub
'
Sub Pfeil()
Dim N As Byte
intKey = 0
For N = 37 To 40
 If GetKeyState(N) 0 Then Call Form\_KeyDown(intKey, 0)
End Sub
'
Private Sub Form\_KeyDown(KeyCode As Integer, Shift As Integer)
If intKey \> 0 Then Command1\_Click
End Sub
'
Private Sub Form\_Load()
Me.KeyPreview = True
End Sub

Gruß
Reinhard

Hallo Reinhard,

bei mir funktioniert dein Vorschlag leider nicht.

Wenn ich eine Pfeiltaste betätige, wird die Sub Form_KeyDown
aufgerufen, die Variable intKey ist aber immer 0.

Die Sub Pfeil wird nur einmal ganz am Anfang aufgerufen.

Hast du mir noch einen Tipp?

Danke.

Gruß
Gunter

Hallo Reinhard,

Kommando zurück, es funktioniert doch - vielen Dank.

Gruß
Gunter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Gunther,

mit sehr sehr vielen rumgetrickse laesst sich das realsieren. Wenn in der Tab Reihenfolge auf der Form keine 2 Buttons oder mehr hintereinander folgen so klappt es wenn du die Key Preview Eigenschaft der Form auf True setzt und dann das KeyDown Ereignis abfangen tust und dort schaust ob die Pfeil Taste gedrueckt wurde. Je nachdem löst du dann das Klick Ereignis des gewuenschten Buttons aus.

Aber ich würde dann schon eher die Variante mit der API vorziehen. Ist einfacher und schneller implementiert :wink: Der Aufruf der API in einen anderen Thread und schon hast du kein ausbremsen deines proggis mehr durch die Routine :wink:

MfG Alex

Hallo Alex,

ganz so glücklich bin ich mit der API Lösung noch nicht.
Zum einen wird irgendwann mal der Focus auf den MediaPlayer gesetzt und da führen die Pfeiltasten andere Funktionen aus. Zum anderen, wenn ich auf meinem ersten Button angekommen bin, springt der Focus nicht mehr weiter und damit wird auch die Sub Pfeil nicht mehr durchlaufen.

Ein drittes Problem ist, dass ich zu Anfang den Focus auf einem Listview habe und auch da funtionieren die Pfeiltasten ja anders.

Also wie kann ich verhindern, dass beim durchblättern der Focus nicht auf den Mediaplayer geht und wie erreiche ich, dass vom ersten Button wieder auf den letzten gesprungnen wird.

Danke.

Gruß
Gunter

Hallo, Gunter.
Hallo, Gunter.

Hier noch eine Variante mit den Tasten-Kombinationen „Strg+Pfeil“ und „Alt+Pfeil“:

Private Sub Command1\_Click()
 Prozedur
End Sub


Private Sub Form\_KeyDown(KeyCode As Integer, Shift As Integer)
 Select Case Shift
 Case 2, 4 'Strg, Alt
 Select Case KeyCode
 Case vbKeyLeft, vbKeyUp, vbKeyRight, vbKeyDown
 Prozedur
 End Select
 End Select
End Sub


Private Sub Prozedur()
 Beep
End Sub

KeyPreview der Form auf True setzen.

Vielleicht hilft Dir das ja weiter.

VG
Carsten

Hallo Carsten,

danke für die zusätzliche Info.

Gruß
Gunter

Hallo Gunter,

ganz so glücklich bin ich mit der API Lösung noch nicht.
Zum einen wird irgendwann mal der Focus auf den MediaPlayer
gesetzt und da führen die Pfeiltasten andere Funktionen aus.

Das war ja auch nur ein Funktionsbeispiel. Ich habe angenommen, daß Du das etwas umbaust und die Cursortasten in Kombination mit Strg, oder Alt prüfst. Dann haben die Cursortasten keine andere Funktion.

Zum anderen, wenn ich auf meinem ersten Button angekommen bin,
springt der Focus nicht mehr weiter und damit wird auch die
Sub Pfeil nicht mehr durchlaufen.

Für die Tabs ist ja auch die Tab-Taste da. Wenn es unbedingt die Corsortasten sein sollen, dann setze den Focus mit Setfocus selbst.

Ein drittes Problem ist, dass ich zu Anfang den Focus auf
einem Listview habe und auch da funtionieren die Pfeiltasten
ja anders.

Da kannst Du ja die normale Funktion verwenden und für z.B. Strg&Up eine Prozedur starten und den Focus selbst setzen.

Also wie kann ich verhindern, dass beim durchblättern der
Focus nicht auf den Mediaplayer geht

Strg&Cursor für die Sonderfunktion verwenden.

und wie erreiche ich,
dass vom ersten Button wieder auf den letzten gesprungnen
wird.

Entweder mit Setfocus oder die Tabstops richtig bearbeiten.
Für die Liste und andere Steuerelemente, die nicht erreicht werden sollen, könntest Du die Eigenschaft ‚Tabstop‘ auf False setzen. Die Steuerelemente sind dann immer noch aktiv, werden durch Tab aber nicht angesprungen.

Gruß Rainer

Hallo Rainer,

habe jetzt die Funktionen auf die Alt+Pfeil gelegt, dann funktioniert alles bestens ohne weitere Änderungen.

Vielen Dank.

Gruß
Gunter

Das war ja auch nur ein Funktionsbeispiel. Ich habe
angenommen, daß Du das etwas umbaust und die Cursortasten in
Kombination mit Strg, oder Alt prüfst. Dann haben die
Cursortasten keine andere Funktion.

habe jetzt die Funktionen auf die Alt+Pfeil gelegt, dann
funktioniert alles bestens ohne weitere Änderungen.

Hallo Gunter,

zeige mal bitte deinen endgültigen Code. Und zähl mal auf was du da alles an Steuerelementen in der Form hast damit ich den Code besser einschätzen kann.

Gruß
Reinhard

zeige mal bitte deinen endgültigen Code. Und zähl mal auf was
du da alles an Steuerelementen in der Form hast damit ich den
Code besser einschätzen kann.

Hallo Reinhard,

der Code sieht so aus:

Sub Pfeil()
Dim n As Byte

intKey = 0

For n = 37 To 40
 If GetKeyState(n) 0 Then Call Form\_KeyDown(intKey, 0)
End Sub

Private Sub Form\_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 Then
 Shift = 0
 If KeyCode = 37 Then
 Command4\_Click
 End If
 If KeyCode = 39 Then
 Command5\_Click
 End If
End If
End Sub

Habe etwa 12 Commands, 4 Comboboxen, 2 Textboxen, einen Mediaplayer und eine Listview.

Warum das ganze funktioniert ist mir nicht klar, da die Sub Pfeil die Sub Form_KeyDown aufruft und ja im 2. Parameter (Shift) eine Null übergibt. Trotzdem ist der Parameter Shift beim betätigen der Alt Taste mit 4 belegt und wird dann richtig ausgewertet.

Gruß
Gunter

[MOD] - Pre-Tag eingefügt

Hallo Gunter.

Sub Pfeil()
Dim n As Byte

intKey = 0

For n = 37 To 40
If GetKeyState(n) 0 Then Call Form_KeyDown(intKey, 0)
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 Then
Shift = 0
If KeyCode = 37 Then
Command4_Click
End If
If KeyCode = 39 Then
Command5_Click
End If
End If
End Sub

Warum das ganze funktioniert ist mir nicht klar

Versuche das Ganze doch einfach 'mal ohne die Sub „Pfeil“ und ohne den API-Aufruf „GetKeyState“.

Das Ereignis „Form_KeyDown“ wird aufgerufen, sobald eine der Tasten heruntergedrückt und festgehalten wird (Shift, Ctrl, Alt, AltGr, Pfeil-Tasten, Bild-Tasten).

Normalerweise brauchst Du auch „Shift“ nicht auf Null (0) setzen, „Shift“ wird Null (0), sobald die Taste(n) wieder losgelassen wird.

VG
Carsten

Hallo Carsten,

dein Vorschlag funktioniert wunderbar.

Vielen Dank.

Gruß
Gunter

Versuche das Ganze doch einfach 'mal ohne die Sub „Pfeil“ und
ohne den API-Aufruf „GetKeyState“.

Das Ereignis „Form_KeyDown“ wird aufgerufen, sobald eine der
Tasten heruntergedrückt und festgehalten wird (Shift, Ctrl,
Alt, AltGr, Pfeil-Tasten, Bild-Tasten).

Normalerweise brauchst Du auch „Shift“ nicht auf Null (0)
setzen, „Shift“ wird Null (0), sobald die Taste(n) wieder
losgelassen wird.

VG
Carsten