| |
Fortgeschrittene ProgrammierungTastenkombination systemweit abfragen | | | Autor: Spitzbube66 | Datum: 14.02.18 12:22 |
| Liebe Gemeinde, folgendes Problem:
ich möchte mit einer frei einstellbaren Tastenkombination, welche systemweit abgefangen werden soll, in meiner Anwendung etwas auslösen. Ich nutze dazu die hier von VBMichi 2006 dargestellte Funktion, etwas abgewandelt: (http://www.vbarchiv.net/forum/read.php?id=2&t=116602&i=116602&v=f)
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 10
End Sub
Private Sub Timer1_Timer()
Dim X As Long
For X = 48 To 90
If CompKey(X, UCase(Chr$(X))) Then Exit Sub
If CompKey(X + 48, UCase("NUM " & Chr$(X))) Then Exit Sub
Next X
If CompKey(8, " {Backspace} ") Then Exit Sub
If CompKey(9, " ") Then Exit Sub
If CompKey(13, vbCrLf) Then Exit Sub
If CompKey(32, " ") Then Exit Sub
If CompKey(186, "Ü") Then Exit Sub
If CompKey(192, "Ö") Then Exit Sub
If CompKey(219, "?") Then Exit Sub
If CompKey(220, "^") Then Exit Sub
If CompKey(211, "`") Then Exit Sub
If CompKey(222, "Ä") Then Exit Sub
For X = 112 To 127
If CompKey(X, "F" & CStr(X - 111)) Then Exit Sub
Next X
End Sub
Private Function CompKey(KCode As Long, KText As String) As Boolean
Dim Result As Integer
Result = GetAsyncKeyState(KCode)
If Result = -32767 Then
Text1.Text = Text1.Text & KText
Text1.SelStart = Len(Text1.Text)
CompKey = True
Else
CompKey = False
End If
End Function Die Abfrage zum Beispiel mit "If CompKey(123) Then" (123 = F12; ich weiß es gibt auch vbKeyF12) funktioniert, auch auf zum Beispiel "If CompKey(vbKeyControl) And CompKey(vbKeyShift) And CompKey(164)" (164 = ALT), also Strg+Shift+Alt, reagiert das Programm, aber nicht auf z.B. Strg + F12, also "If CompKey(vbKeyControl) And CompKey(123)".
Ich komme hier gerade nicht weiter und hoffe auf einen guten Tipp von Euch.
Gruß Frank
Beitrag wurde zuletzt am 14.02.18 um 12:45:21 editiert. | |
Re: Tastenkombination systemweit abfragen | | | Autor: Franki | Datum: 19.02.18 02:28 |
| Hallo,
bei den Funktionstasten musst du getrennt auswerten auf die Funktionstaste selbst bzw. deren Kombination mit ALT/STRG/SHIFT usw.
Schau dir mal dieses alte Beispiel an:
option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal _
hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
ByVal cy As Long, ByVal wFlags As Long) As Long
Private Sub Form_Activate()
Dim Top As Single
Top = 0
Line1(0).X1 = 0
Line1(0).X2 = Me.ScaleWidth
Line1(0).Y1 = Top
Line1(0).Y2 = Top
Top = Screen.TwipsPerPixelY
Line1(1).X1 = 0
Line1(1).X2 = Me.ScaleWidth
Line1(1).Y1 = Top
Line1(1).Y2 = Top
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim I As Integer
lblTT(0).Caption = ""
lblTT(1).Caption = ""
lblASC.Caption = ""
lblTT(0).Caption = KeyCode
KeyCode = 0
For I = 0 To 2
If (2 ^ I) And Shift Then
lblShift(I).ForeColor = vbRed
Else
lblShift(I).ForeColor = &H80000011
End If
Next I
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
lblTT(1).Caption = KeyAscii
lblASC.Caption = Chr$(KeyAscii)
End Sub
Private Sub Form_Load()
lblASC.Caption = ""
End Sub
Private Sub mnuAnsItem_Click()
Dim Switch As Long
mnuAnsItem.Checked = Not mnuAnsItem.Checked
If mnuAnsItem.Checked Then
Switch = -1 'im Vordergrund
Else
Switch = -2 'nicht im Vordergrund
End If
'Switch: - 1 = immer im Vordergrund ein / -2 = normal (nicht im
' Vordergrund)
Call SetWindowPos(Me.hwnd, Switch, 0, 0, 0, 0, &H53)
End Sub Da siehst du, dass jede Funktionstaste immer den selbsn Wert liefert egal mit was zusätzlich aufgerufen. Aber dennoch hast du eine Denkanstoß wie du die Zusatztaste auswerten kannst. (Ist unten in rot jeweils hervorgehoben)
Gruß
Frank | |
Re: Tastenkombination systemweit abfragen | | | Autor: Spitzbube66 | Datum: 19.02.18 09:38 |
| Hallo Frank,
erstmal Danke für Deine Antwort. Im eigenen Programm mit dem KeyDown Ereignis auf der Form funktioniert das so, aber ich möchte die Tastenkombination systemweit, also außerhalb der eigenen Anwendung, abfragen. Hatte schonmal jemand das gleiche Problem, gibt es einen anderen Lösungsansatz, als über die "GetAsyncKeyState" Funktion alle paar Millisekunden die Tasten abzufragen? Ich verstehe halt nicht, warum z.B "STRG + ALT + SHIFT" sauber erkannt wird, aber nicht "STRG + F12".
Gruß
Frank | |
Re: Tastenkombination systemweit abfragen | | | Autor: Spitzbube66 | Datum: 21.02.18 17:01 |
| Hallo Markus,
herzlichen Dank für den Link, der hat mir tatsächlich sehr geholfen, bzw. der darin weiterführende Link zu http://www.vbarchiv.net/tipps/details.php?id=1021. Ich konnte die Funktionen perfekt für mich abändern und anpassen. Ich bin begeistert!
Gruß & Dank
Frank | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|