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