Moin,
ich bin gerade am Verzweifeln... Wieso funktioniert _IsPressed nicht mit ß? Hexadezimal ist es DF, aber es geht nicht Kann mit da einer helfen?
Schnieker
Moin,
ich bin gerade am Verzweifeln... Wieso funktioniert _IsPressed nicht mit ß? Hexadezimal ist es DF, aber es geht nicht Kann mit da einer helfen?
Schnieker
Das ß taucht aber in der Hilfe zu _IsPressed gar nicht auf. Du kannst aber den Scancode "BD" nehmen, dass korreliert auf der engl. Tastatur nämlich mit "-" welches sich auf der selben Stelle befindet.
Ein kleiner Test bestätigt das auch:
Hatte ich auch schon versucht. Das geht aber irgendwie nur wenn ich die Tastatur auf englisch stelle. Oder gibt's da nen Trick?
Auf einer engl. Tastatur... er hat aber sicher eine deutsche... und da ist das "-" doch an einer anderen Stelle?!
Bei mir (deutsche Tastatur) reagiert _IsPressed bei $VK_OEM_8 = 0xDF, wenn ich "ß" drücke.
Ich hab auch eine deutsche Tastatur, und _IsPressed reagiert bei mir mit 0xBD auf ß.
Wenn ich auf EN umschalte befindet sich das "-" an der Stelle mit dem selben Scancode.
Bei mir geht irgendwie beides nicht
Hiermit kannst du dir die gedrückte Taste via ToolTip anzeigen lassen... Abbruch mit ESC!
;-- TIME_STAMP 2018-06-06 04:00:06 v 0.1
#Region ;************ Includes ************
#Include <WindowsConstants.au3>
#include <Misc.au3>
#EndRegion ;************ Includes ************
Local $hDLL = DllOpen("user32.dll"), $hGUI = GUICreate('', 1, 1, -1, -1, $WS_POPUP), $x = @DesktopWidth / 2 - 50, $y = @DesktopHeight / 2
ToolTip('Die gedrückte Taste wird als Tooltip angezeigt... Abbruch mit ESC!', $x, $y)
Sleep(1000)
While True
For $i = 1 To 0xFF
If _IsPressed(Hex($i, 2), $hDLL) Then
If $i = 0x1B Then ExitLoop 2 ; ESC
ToolTip('_IsPressed: ' & Hex($i, 2) & @CRLF, $x, $y)
While _IsPressed(Hex($i, 2), $hDLL)
Sleep(250)
WEnd
EndIf
Next
If Not WinActive($hGUI) Then WinActivate($hGUI)
Sleep(10)
WEnd
ToolTip('')
DllClose($hDLL)
Alles anzeigen
Wenn dein Script eine GUI hat und die Taste(n) nur abgefragt werden sollen, wenn diese aktiv ist, solltest du besser GUISetAccelerators verwenden.
Danke! Damit hab ich herausgefunden dass bei mir ß 0xDB ist! Klappt, danke!
Danke! Damit hab ich herausgefunden dass bei mir ß 0xDB ist! Klappt, danke!
Hat mein Skript bei dir nicht geklappt oder hast du es überhaupt nicht probiert? Bei mir spuckt der für ß auch 0xDB aus.
Ohh, ich sehe grad, ich habe beim Forumpost die Buchstaben vertauscht, tatsächlich meinte ich natürlich 0xDB!
Moin.
Meine Erweiterung übersetzt nun auch den HEX-Code in das entsprechende Zeichen auf der Tastatur:
#Include <WindowsConstants.au3>
#include <Misc.au3>
; Achtung deutsche und englische Tastatur haben einige Tasten anders - deswegen gibt es im Array gelegentlich auch ein Ergebnis unter [$i][2]
Local $aTastaturZeichen = [["01", "Left Mouse"], ["02", "Right Mouse"], ["04", "Middle Mouse"], ["08", "BACKSPACE"], ["09", "TAB"], ["0C", "CLEAR ?"], ["0D", "ENTER"], ["10", "SHIFT"], ["11", "CTRL"], ["12", "ALT"], ["13", "PAUSE"], _
["14", "CAPS LOCK"], ["1B", "ESC"], ["20", "SPACEBAR"], ["21", "PAGE UP"], ["22", "PAGE DOWN"], ["23", "END"], ["24", "HOME"], ["25", "LEFT ARROW"], ["26", "UP ARROW"], ["27", "RIGHT ARROW"], ["28", "DOWN ARROW"], _
["29", "SELECT ?"], ["2A", "PRINT ?"], ["2B", "EXECUTE ?"], ["2C", "PRINT SCREEN"], ["2D", "INS"], ["2E", "DEL"], ["30", "0"], ["31", "1"], ["32", "2"], ["33", "3"], ["34", "4"], ["35", "5"], ["36", "6"], ["37", "7"], _
["38", "8"], ["39", "9"], ["41", "A"], ["42", "B"], ["43", "C"], ["44", "D"], ["45", "E"], ["46", "F"], ["47", "G"], ["48", "H"], ["49", "I"], ["4A", "J"], ["4B", "K"], ["4C", "L"], ["4D", "M"], ["4E", "N"], ["4F", "O"], _
["50", "P"], ["51", "Q"], ["52", "R"], ["53", "S"], ["54", "T"], ["55", "U"], ["56", "V"], ["57", "W"], ["58", "X"], ["59", "Y"], ["5A", "Z"], ["5B", "Left WIN"], ["5C", "Right WIN"], ["5D", "Right MENU"], _
["60", "NUM 0"], ["61", "NUM 1"], ["62", "NUM 2"], ["63", "NUM 3"], ["64", "NUM 4"], ["65", "NUM 5"], ["66", "NUM 6"], ["67", "NUM 7"], ["68", "NUM 8"], ["69", "NUM 9"], ["6A", "NUM *"], ["6B", "NUM +"], ["6C", "NUM ."], _
["6D", "NUM -"], ["6E", "NUM ,"], ["6F", "NUM /"], ["70", "F1"], ["71", "F2"], ["72", "F3"], ["73", "F4"], ["74", "F5"], ["75", "F6"], ["76", "F7"], ["77", "F8"], ["78", "F9"], ["79", "F10"], ["7A", "F11"], ["7B", "F12"], _
["7C", "F13"], ["7D", "F14"], ["7E", "F15"], ["7F", "F16"], ["90", "NUM"], ["91", "SCROLL"], ["A0", "Left SHIFT"], ["A1", "Right SHIFT"], ["A2", "Left CTRL"], ["A3", "Right CTRL"], ["A4", "Left MENU"], ["A5", "Right MENU"], _
["BA", "Ü", ";"], ["BB", "+", "="], ["BC", ","], ["BD", "-"], ["BE", "."], ["BF", "#", "/"], ["C0", "Ö", "`"], ["DB", "ß", "["], ["DC", "^", "\"], ["DD", "´", "]"], ["DE", "Ä", "#"], ["E2", "<", "n.a."]]
Local $hDLL = DllOpen("user32.dll"), $hGUI = GUICreate('', 1, 1, -1, -1, $WS_POPUP), $x = 1, $y = 1 ;$x = @DesktopWidth / 2 - 50, $y = @DesktopHeight / 2
ToolTip('Die blockierte Taste wird als Tooltip angezeigt... Abbruch mit ESC!', $x, $y)
Sleep(1000)
Local $sZeichenDeutsch, $sZeichenEnglisch
While True
For $i = 1 To 0xFF
If _IsPressed(Hex($i, 2), $hDLL) Then
If $i = 0x1B Then ExitLoop 2 ; ESC
For $j = 0 To UBound($aTastaturZeichen) - 1
If $aTastaturZeichen[$j][0] = Hex($i, 2) Then
$sZeichenDeutsch = $aTastaturZeichen[$j][1]
$sZeichenEnglisch = $aTastaturZeichen[$j][2]
ExitLoop
EndIf
Next
If $sZeichenEnglisch = "" Then ; deutsche und englische Belegung gleich
If $sZeichenDeutsch <> "" Then
ToolTip('Blockierte Taste: ' & $sZeichenDeutsch & @CRLF, $x, $y)
Else
ToolTip('Blockierte Taste HEX: ' & Hex($i, 2) & @CRLF, $x, $y) ; keine Übersetzung des HEX-Code im Array gefunden
EndIf
Else ; deutsche und englische Belegung unterschiedlich
ToolTip('Blockierte deutsche Taste: ' & $sZeichenDeutsch & @CRLF & 'Blockierte englische Taste: ' & $sZeichenEnglisch & @CRLF, $x, $y)
EndIf
While _IsPressed(Hex($i, 2), $hDLL)
Sleep(250)
WEnd
ToolTip('Blockierte Taste: ', $x, $y)
$sZeichenDeutsch = ""
$sZeichenEnglisch = ""
EndIf
Next
If Not WinActive($hGUI) Then WinActivate($hGUI)
Sleep(10)
WEnd
ToolTip('')
DllClose($hDLL)
Alles anzeigen
Immer wenn die deutsche und englische Belegung unterschiedlich sind werden beide angegeben.
Jetzt fehlt mir nur noch die Auswertung der Modifier links oder rechts. Denn dabei wird immer der Standardcode für den Modifier zusammen mit dem Code des Modifiers spezialisiert auf seine Seite angegeben. Mit anderen Worten die linke SHIFT-Taste spukt immer die "10" und "A0" raus. Der Loop wird aber bereits bei einem Treffer von 10 beendet und deswegen gar nicht bis zu A0 durchgeschritten.
Hat da jemand eine Idee dazu? Wenn ich einfach die ["10", "SHIFT"] rauswerfe dann wird meistens der HEX-Code angezeigt und nicht "Left SHIFT".
Gruß, Conrad
Schau mal hier...
;-- TIME_STAMP 2018-06-18 23:28:52 v 0.1
#include <WindowsConstants.au3>
#include <Misc.au3>
; Im globalen Bereich (außerhalb von Funktionen) gibt es keine lokalen Variablen - auch wenn du sie mit Local deklarierst, sie sind immer global!
Global $sZeichen = "A0:Left SHIFT|A1:Right SHIFT|A2:Left CTRL|A3:Right CTRL|A4:Left MENU|A5:Right MENU|01:Left Mouse|02:Right Mouse|04:Middle Mouse|5B:Left WIN|5C:Right WIN|5D:Right MENU|" & _
"08:BACKSPACE|09:TAB|0C:CLEAR ?|0D:ENTER|10:SHIFT|11:CTRL|12:ALT|13:PAUSE|14:CAPS LOCK|1B:ESC|20:SPACEBAR|21:PAGE UP|22:PAGE DOWN|23:END|24:HOME|25:LEFT ARROW|26:UP ARROW|" & _
"27:RIGHT ARROW|28:DOWN ARROW|29:SELECT ?|2A:PRINT ?|2B:EXECUTE ?|2C:PRINT SCREEN|2D:INS|2E:DEL|30:0|31:1|32:2|33:3|34:4|35:5|36:6|37:7|38:8|39:9|41:A|42:B|43:C|44:D|45:E|" & _
"46:F|47:G|48:H|49:I|4A:J|4B:K|4C:L|4D:M|4E:N|4F:O|50:P|51:Q|52:R|53:S|54:T|55:U|56:V|57:W|58:X|59:Y|5A:Z|60:NUM 0|61:NUM 1|62:NUM 2|63:NUM 3|64:NUM 4|65:NUM 5|66:NUM 6|" & _
"67:NUM 7|68:NUM 8|69:NUM 9|6A:NUM *|6B:NUM +|6C:NUM .|6D:NUM -|6E:NUM ,|6F:NUM /|70:F1|71:F2|72:F3|73:F4|74:F5|75:F6|76:F7|77:F8|78:F9|79:F10|7A:F11|7B:F12|7C:F13|7D:F14|" & _
"7E:F15|7F:F16|90:NUM|91:SCROLL|BA:Ü:;|BB:+:=|BC:,|BD:-|BE:.|BF:#:/|C0:Ö:`|DB:ß:|DC:^:\|DD:´:,|DE:Ä:#|E2:<:n.a."
Global $aSplit, $aZeichen = StringSplit($sZeichen, '|', 2), $aTastaturZeichen[UBound($aZeichen)][3], $sZeichenDeutsch, $sZeichenEnglisch
For $i = 0 To UBound($aTastaturZeichen) - 1 Step 1
$aSplit = StringSplit($aZeichen[$i], ':', 2)
$aTastaturZeichen[$i][0] = $aSplit[0]
$aTastaturZeichen[$i][1] = $aSplit[1]
$aTastaturZeichen[$i][2] = UBound($aSplit) = 3 ? $aSplit[2] : $aSplit[1]
Next
ConsoleWrite(UBound($aTastaturZeichen) & @CRLF)
Global $hDLL = DllOpen("user32.dll"), $hGUI = GUICreate('', 1, 1, -1, -1, $WS_POPUP)
_ToolTip('Die blockierte Taste wird als Tooltip angezeigt... Abbruch mit ESC!')
Sleep(1000)
ToolTip('')ß
While True
For $i = 0 To UBound($aTastaturZeichen) - 1
If _IsPressed($aTastaturZeichen[$i][0], $hDLL) Then
If $aTastaturZeichen[$i][0] = "1B" Then ExitLoop 2 ; ESC
$sZeichenDeutsch = $aTastaturZeichen[$i][1]
$sZeichenEnglisch = $aTastaturZeichen[$i][2]
_ToolTip('Hex-Code: ' & $aTastaturZeichen[$i][0] & @CRLF & 'Deutsche Taste: ' & $aTastaturZeichen[$i][1] & @CRLF & 'Englische Taste: ' & $aTastaturZeichen[$i][2])
While _IsPressed($aTastaturZeichen[$i][0], $hDLL)
Sleep(250)
WEnd
ToolTip('')
If Not WinActive($hGUI) Then WinActivate($hGUI)
ExitLoop
EndIf
Next
WEnd
DllClose($hDLL)
Func _ToolTip($sText)
Local $aMP = MouseGetPos()
ToolTip($sText, $aMP[0] - 50, $aMP[1] + 50)
EndFunc
Alles anzeigen
Moin. Ich habe über viele Inputs mir mal was anderes gebastelt:
OnAutoItExitRegister("_Exit")
Global $__inkey_flag = False
Global $__Tasta_code[256][2], $hDLL = DllOpen("user32.dll")
Global $hGui = GUICreate("Taste klemmt", 400, 115)
Global $label1 = GUICtrlCreateLabel("", 10, 10, 380, 30)
Global $label2 = GUICtrlCreateLabel("", 10, 40, 380, 30)
Global $label3 = GUICtrlCreateLabel("", 10, 70, 380, 30)
GUICtrlCreateLabel("", 0, 100, 10, 15) ; Dummy um die ersten 10 Pixel mit HG-Farbe zu füllen
GUICtrlSetBkColor(-1, 0xBBBBBB)
Global $hStatus = GUICtrlCreateLabel("Gültig für Tastatur mit deutschem Layout. Beenden mit ESC.", 10, 100, 400, 15)
GUICtrlSetBkColor(-1, 0xBBBBBB)
GUISetState()
Local $a
While GUIGetMsg() <> -3
$a = _inkey() ;Tastenanzeige
GUICtrlSetData($label1, "KEY:" & @TAB & $a)
$a = _inkey(1) ;hexcodes
GUICtrlSetData($label2, "HEX:" & @TAB & $a)
$a = _inkey(2) ;deccodes
GUICtrlSetData($label3, "DEC:" & @TAB & $a)
Sleep(10)
WEnd
Exit
Func _inkey($flag = 0) ;gibt die gleichzeitig gedrückten Tasten zurück, wenn flag=1 gibt dann tastaturcode zurück
If $__inkey_flag = False Then ;nur in der ersten Runde das Tasten-Array füllen
$__inkey_flag = True
Local $a = [["01", "Left Mouse"], ["02", "Right Mouse"], ["04", "Middle Mouse"], ["08", "BACKSPACE"], ["09", "TAB"], ["0C", "CLEAR ?"], ["0D", "ENTER"], ["10", "SHIFT"], ["11", "CTRL"], ["12", "ALT"], ["13", "PAUSE"], _
["14", "CAPS LOCK"], ["1B", "ESC"], ["20", "SPACEBAR"], ["21", "PAGE UP"], ["22", "PAGE DOWN"], ["23", "END"], ["24", "HOME"], ["25", "LEFT ARROW"], ["26", "UP ARROW"], ["27", "RIGHT ARROW"], ["28", "DOWN ARROW"], _
["29", "SELECT ?"], ["2A", "PRINT ?"], ["2B", "EXECUTE ?"], ["2C", "PRINT SCREEN"], ["2D", "INS"], ["2E", "DEL"], ["30", "0"], ["31", "1"], ["32", "2"], ["33", "3"], ["34", "4"], ["35", "5"], ["36", "6"], ["37", "7"], _
["38", "8"], ["39", "9"], ["41", "A"], ["42", "B"], ["43", "C"], ["44", "D"], ["45", "E"], ["46", "F"], ["47", "G"], ["48", "H"], ["49", "I"], ["4A", "J"], ["4B", "K"], ["4C", "L"], ["4D", "M"], ["4E", "N"], ["4F", "O"], _
["50", "P"], ["51", "Q"], ["52", "R"], ["53", "S"], ["54", "T"], ["55", "U"], ["56", "V"], ["57", "W"], ["58", "X"], ["59", "Y"], ["5A", "Z"], ["5B", "Left WIN"], ["5C", "Right WIN"], ["5D", "Right MENU"], _
["60", "NUM0"], ["61", "NUM1"], ["62", "NUM2"], ["63", "NUM3"], ["64", "NUM4"], ["65", "NUM5"], ["66", "NUM6"], ["67", "NUM7"], ["68", "NUM8"], ["69", "NUM9"], ["6A", "NUM*"], ["6B", "NUM+"], ["6C", "NUM."], _
["6D", "NUM-"], ["6E", "NUM,"], ["6F", "NUM/"], ["70", "F1"], ["71", "F2"], ["72", "F3"], ["73", "F4"], ["74", "F5"], ["75", "F6"], ["76", "F7"], ["77", "F8"], ["78", "F9"], ["79", "F10"], ["7A", "F11"], ["7B", "F12"], _
["7C", "F13"], ["7D", "F14"], ["7E", "F15"], ["7F", "F16"], ["90", "NUM"], ["91", "SCROLL"], ["A0", "Left SHIFT"], ["A1", "Right SHIFT"], ["A2", "Left CTRL"], ["A3", "Right CTRL"], ["A4", "Left MENU"], ["A5", "Right MENU"], _
["BA", "Ü", ";"], ["BB", "+", "="], ["BC", ","], ["BD", "-"], ["BE", "."], ["BF", "#", "/"], ["C0", "Ö", "`"], ["DB", "ß", "["], ["DC", "^", "\"], ["DD", "´", "]"], ["DE", "Ä", "#"], ["E2", "<", "n.a."]]
For $i = 0 To UBound($a) - 1
$__Tasta_code[Dec($a[$i][0], 2)][1] = $a[$i][1] ; es werden nur bekannte Codes in das Array geschrieben, der Rest bleibt leer
Next
EndIf
Local $string = "" ;gedrückte Tasten
For $i = 1 To 254 ;eigentlich nur bis 221
Local $key = DllCall($hDLL, "short", "GetAsyncKeyState", "int", $i)
;~ Local $key = DllCall($hDLL, "short", "GetKeyState", "int", $i)
If BitAND($key[0], 0x8000) Then ;MSB gesetzt
Switch $flag
Case 0
If $__Tasta_code[$i][1] = "" Then $__Tasta_code[$i][1] = "unknown code = 0x" & Hex($i, 2) & " ";falls Tastencode unbekannt
$string &= "[" & $__Tasta_code[$i][1] & "]" & @TAB
Case 1
$string &= "0x" & Hex($i, 2) & @TAB
Case 2
$string &= $i & @TAB
EndSwitch
EndIf
Next
Return $string
EndFunc ;==>_inkey
Func _Exit()
DllClose($hDLL)
EndFunc
Alles anzeigen
Das funktioniert auch echt fluffig. Nun passiert aber was merkwürdiges. Ich drücke "ASDF" gleichzeitig und bekomme es auch angezeigt. Drücke ich nun "G" oder "H" dazu tauchen diese bei mir nicht auf. Drücke ich nur das "F" im Wechsel mit "G" und "H" kann ich nun die 2 Buchstaben gleichzeitig sehen, aber niemals "FGH" gleichzeitig. Hat da jemand irgendeine Idee?
Gruß, Conrad
Das hängt vermutlich mit deiner Tastatur zusammen. Diese können selten mehr als 3-4 Tasten gleichzeitig erkennen und dabei kommt es manchmal auch auf die Tastenkombination an.
Das ist dann also je nach Tastatur unterschiedlich.
Ich würde auch mit Hooks arbeiten, da dann nicht permanent in einer Schleife die Funktion durchläuft sondern von Windows das Keyboard-event getriggered wird, sobald eine Taste gedrückt wird. -> CPU-Auslastung.
Mein Tool wird nur dann gestartet, wenn ich den Verdacht einer hängenden Taste habe, da sollte die Schleife nicht das Problem sein.
Aber mich würde schon interessieren, wie Du das optimieren würdest. Hätte das was mit _WinAPI_SetWindowsHookEx() zu tun?
Hätte das was mit _WinAPI_SetWindowsHookEx() zu tun?
Genau. Ist eine interessante Sache. Leider wird das auch für gar nicht gern gesehene Aktivitäten (z.B. Keyloggger) genutzt.
Deshalb halten wir uns mit Unterstützung zu diesem Thema etwas bedeckt. Mit etwas eigener Anstrengung findet man dann schon zu Lösungen.
Da Scriptkiddies sich nicht gern anstrengen, reichen unsere vagen Hinweise den Usern eigentlich.
Ja, das dachte ich mir auch schon. Ich versuche mal was und frage bei Details dann noch mal nach.
Gruß, Conrad