Moin, ![]()
momentan arbeite ich an einer kleinen Library, die aus GDI+ Controls bestehen soll.
Buttons, Progress, Label habe ich beispielsweise schon umgesetzt.
Jetzt bin ich an einem Input Control dran. Allerdings komme ich hier nicht weiter. ![]()
Bisher habe ich mir überlegt, wie man ein Key Event überhaupt auslesen kann.
Dabei hat mir folgendes Beispiel etwas weiter geholfen:
https://github.com/3gstudent/Auto…r/keylogger.au3
Das Problem ist jedoch, dass die Microsoft Funktion "KBDLLHOOKSTRUCT"
ausschließlich "low-level" input events erkennt. Wenn ich jetzt jedoch Shift+1
zusammen drücke, um ein Ausrufezeichen (je nach Layout) auszugeben, würde ich
aber nur die 1 aus der Funktion herausbekommen. Ich könnte das jetzt theoretisch
auch hardcoden und abfragen: falls shift+1 gedrückt wurde, erweitere den Input-String mit einem Ausrufezeichen.
Aber das würde ja nur auf dem deutschen Layout funktionieren. ![]()
Hat jemand eine Idee, wie man auch die anderen Keys auslesen kann?
Das bereitet mir echt Kopfschmerzen.. ![]()
Dies ist mein modifiziertes Testscript von dem Beispiel aus github:
Beim Ausführen des Scripts werden die gedrückten Keys über ein Label angezeigt.
; ORIGINAL SOURCE: https://github.com/3gstudent/AutoIt-Keylogger/blob/master/keylogger.au3
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
; HEADER
Global $hKeyLogHook, $hKeyLogStub_KeyProc
Global $keyLogGetPressedKey
Global $keyLogIsPressedShift = False
Global $keyLogIsPressedAlt = False
Global $keyLogIsPressedCtrl = False
Global $keyLogIsPressedWindows = False
; END_OF_HEADER
_KeyLogInit()
While 1
Sleep(10)
WEnd
Func _KeyLogInit()
Local $hmod
$hKeyLogStub_KeyProc = DllCallbackRegister("_KeyLogKeyRegister", "long", "int;wparam;lparam")
$hmod = _WinAPI_GetModuleHandle(0)
$hKeyLogHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyLogStub_KeyProc), $hmod)
EndFunc
Func _KeyLogGetPressedKey()
Return $keyLogGetPressedKey
EndFunc
Func _KeyLogKeyIsAnum($gKeyCode)
; number
If $gKeyCode >= 48 And $gKeyCode <= 57 Then
Return True
EndIf
; numpad number
If $gKeyCode >= 96 And $gKeyCode <= 105 Then
Return True
EndIf
Return False
EndFunc
Func _KeyLogSetPressedKey($gKey)
$keyLogGetPressedKey = $gKey
EndFunc
Func _KeyLogEvaluateKey($gKeyCode, $keyIsDown)
Local $keyLogBuffer = _KeyLogGetKeyCode($gKeyCode)
; TODO handle multiple pressed keys like shift + key
If $keyLogBuffer = "{Shift}" Then
$keyLogIsPressedShift = $keyIsDown
EndIf
ToolTip($keyLogBuffer & " " & $keyLogIsPressedShift)
; TEST return if not anum
If Not _KeyLogKeyIsAnum($gKeyCode) Then
Return
EndIf
_KeyLogSetPressedKey($keyLogBuffer)
EndFunc
Func _KeyLogGetKeyCode($gKeyCode)
Local $keyLogGetKey = ""
If $gKeyCode = 8 Then
$keyLogGetKey = "{backspace}"
EndIf
If $gKeyCode = 9 Then
$keyLogGetKey = "{TAB}"
EndIf
If $gKeyCode = 13 Then
$keyLogGetKey = "{ENTER}"
EndIf
If $gKeyCode = 19 Then
$keyLogGetKey = "{PAUSE}"
EndIf
If $gKeyCode = 20 Then
$keyLogGetKey = "{CAPSLOCK}"
EndIf
If $gKeyCode = 27 Then
$keyLogGetKey = "{ESC}"
EndIf
If $gKeyCode = 32 Then
$keyLogGetKey = "{SPACE}"
EndIf
If $gKeyCode = 33 Then
$keyLogGetKey = "{PAGEUP}"
EndIf
If $gKeyCode = 34 Then
$keyLogGetKey = "{PAGEDOWN}"
EndIf
If $gKeyCode = 35 Then
$keyLogGetKey = "{END}"
EndIf
If $gKeyCode = 36 Then
$keyLogGetKey = "{HOME}"
EndIf
If $gKeyCode = 37 Then
$keyLogGetKey = "{¡û}"
EndIf
If $gKeyCode = 38 Then
$keyLogGetKey = "{¡ü}"
EndIf
If $gKeyCode = 39 Then
$keyLogGetKey = "{¡ú}"
EndIf
If $gKeyCode = 40 Then
$keyLogGetKey = "{¡ý}"
EndIf
If $gKeyCode = 42 Then
$keyLogGetKey = "{PRINT}"
EndIf
If $gKeyCode = 44 Then
$keyLogGetKey = "{PRINT SCREEN}"
EndIf
If $gKeyCode = 45 Then
$keyLogGetKey = "{INS}"
EndIf
If $gKeyCode = 46 Then
$keyLogGetKey = "{DEL}"
EndIf
If $gKeyCode = 48 Or $gKeyCode = 96 Then
$keyLogGetKey = 0
EndIf
If $gKeyCode = 49 Or $gKeyCode = 97 Then
$keyLogGetKey = 1
EndIf
If $gKeyCode = 50 Or $gKeyCode = 98 Then
$keyLogGetKey = 2
EndIf
If $gKeyCode = 51 Or $gKeyCode = 99 Then
$keyLogGetKey = 3
EndIf
If $gKeyCode = 52 Or $gKeyCode = 100 Then
$keyLogGetKey = 4
EndIf
If $gKeyCode = 53 Or $gKeyCode = 101 Then
$keyLogGetKey = 5
EndIf
If $gKeyCode = 54 Or $gKeyCode = 102 Then
$keyLogGetKey = 6
EndIf
If $gKeyCode = 55 Or $gKeyCode = 103 Then
$keyLogGetKey = 7
EndIf
If $gKeyCode = 56 Or $gKeyCode = 104 Then
$keyLogGetKey = 8
EndIf
If $gKeyCode = 57 Or $gKeyCode = 105 Then
$keyLogGetKey = 9
EndIf
If $gKeyCode = 65 Then
$keyLogGetKey = "a"
EndIf
If $gKeyCode = 66 Then
$keyLogGetKey = "b"
EndIf
If $gKeyCode = 67 Then
$keyLogGetKey = "c"
EndIf
If $gKeyCode = 68 Then
$keyLogGetKey = "d"
EndIf
If $gKeyCode = 69 Then
$keyLogGetKey = "e"
EndIf
If $gKeyCode = 70 Then
$keyLogGetKey = "f"
EndIf
If $gKeyCode = 71 Then
$keyLogGetKey = "g"
EndIf
If $gKeyCode = 72 Then
$keyLogGetKey = "h"
EndIf
If $gKeyCode = 73 Then
$keyLogGetKey = "i"
EndIf
If $gKeyCode = 74 Then
$keyLogGetKey = "j"
EndIf
If $gKeyCode = 75 Then
$keyLogGetKey = "k"
EndIf
If $gKeyCode = 76 Then
$keyLogGetKey = "l"
EndIf
If $gKeyCode = 77 Then
$keyLogGetKey = "m"
EndIf
If $gKeyCode = 78 Then
$keyLogGetKey = "n"
EndIf
If $gKeyCode = 79 Then
$keyLogGetKey = "o"
EndIf
If $gKeyCode = 80 Then
$keyLogGetKey = "p"
EndIf
If $gKeyCode = 81 Then
$keyLogGetKey = "q"
EndIf
If $gKeyCode = 82 Then
$keyLogGetKey = "r"
EndIf
If $gKeyCode = 83 Then
$keyLogGetKey = "s"
EndIf
If $gKeyCode = 84 Then
$keyLogGetKey = "t"
EndIf
If $gKeyCode = 85 Then
$keyLogGetKey = "u"
EndIf
If $gKeyCode = 86 Then
$keyLogGetKey = "v"
EndIf
If $gKeyCode = 87 Then
$keyLogGetKey = "w"
EndIf
If $gKeyCode = 88 Then
$keyLogGetKey = "x"
EndIf
If $gKeyCode = 89 Then
$keyLogGetKey = "y"
EndIf
If $gKeyCode = 90 Then
$keyLogGetKey = "z"
EndIf
If $gKeyCode = 91 Or $gKeyCode = 92 Then
$keyLogGetKey = "{Windows}"
EndIf
If $gKeyCode = 106 Then
$keyLogGetKey = "*"
EndIf
If $gKeyCode = 107 Then
$keyLogGetKey = "+"
EndIf
If $gKeyCode = 109 Or $gKeyCode = 189 Then
$keyLogGetKey = "-"
EndIf
If $gKeyCode = 110 Or $gKeyCode = 190 Then
$keyLogGetKey = "."
EndIf
If $gKeyCode = 111 Or $gKeyCode = 191 Then
$keyLogGetKey = "/"
EndIf
If $gKeyCode = 112 Then
$keyLogGetKey = "{F1}"
EndIf
If $gKeyCode = 113 Then
$keyLogGetKey = "{F2}"
EndIf
If $gKeyCode = 114 Then
$keyLogGetKey = "{F3}"
EndIf
If $gKeyCode = 115 Then
$keyLogGetKey = "{F4}"
EndIf
If $gKeyCode = 116 Then
$keyLogGetKey = "{F5}"
EndIf
If $gKeyCode = 117 Then
$keyLogGetKey = "{F6}"
EndIf
If $gKeyCode = 118 Then
$keyLogGetKey = "{F7}"
EndIf
If $gKeyCode = 119 Then
$keyLogGetKey = "{F8}"
EndIf
If $gKeyCode = 120 Then
$keyLogGetKey = "{F9}"
EndIf
If $gKeyCode = 121 Then
$keyLogGetKey = "{F10}"
EndIf
If $gKeyCode = 122 Then
$keyLogGetKey = "{F11}"
EndIf
If $gKeyCode = 123 Then
$keyLogGetKey = "{F12}"
EndIf
If $gKeyCode = 124 Then
$keyLogGetKey = "{F13}"
EndIf
If $gKeyCode = 125 Then
$keyLogGetKey = "{F14}"
EndIf
If $gKeyCode = 126 Then
$keyLogGetKey = "{F15}"
EndIf
If $gKeyCode = 127 Then
$keyLogGetKey = "{F16}"
EndIf
If $gKeyCode = 144 Then
$keyLogGetKey = "{NUMLOCK}"
EndIf
If $gKeyCode = 145 Then
$keyLogGetKey = "{SCROLLLOCK}"
EndIf
If $gKeyCode = 160 Or $gKeyCode = 161 Then
$keyLogGetKey = "{Shift}"
EndIf
If $gKeyCode = 162 Or $gKeyCode = 163 Then
$keyLogGetKey = "{Ctrl}"
EndIf
If $gKeyCode = 164 Then
$keyLogGetKey = "{Alt}"
EndIf
If $gKeyCode = 186 Then
$keyLogGetKey = ";"
EndIf
If $gKeyCode = 187 Then
$keyLogGetKey = "="
EndIf
If $gKeyCode = 188 Then
$keyLogGetKey = ","
EndIf
If $gKeyCode = 192 Then
$keyLogGetKey = "`"
EndIf
If $gKeyCode = 219 Then
$keyLogGetKey = "["
EndIf
If $gKeyCode = 220 Then
$keyLogGetKey = ""
EndIf
If $gKeyCode = 221 Then
$keyLogGetKey = "]"
EndIf
Return String($keyLogGetKey)
EndFunc
Func _KeyLogKeyRegister($nCode, $wParam, $lParam)
Local $tKEYHOOKS
$tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
If $nCode < 0 Then
Return _WinAPI_CallNextHookEx($hKeyLogHook, $nCode, $wParam, $lParam)
EndIf
If $wParam = $WM_KEYDOWN Then
_KeyLogEvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"), True)
ElseIf $wParam = $WM_KEYUP Then
_KeyLogEvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"), False)
Else
Local $flags = DllStructGetData($tKEYHOOKS, "flags")
Switch $flags
Case $LLKHF_ALTDOWN
_KeyLogEvaluateKey(DllStructGetData($tKEYHOOKS, "vkCode"), True)
EndSwitch
EndIf
Return _WinAPI_CallNextHookEx($hKeyLogHook, $nCode, $wParam, $lParam)
EndFunc
Alles anzeigen