Hallo.
Dieses mal geht es um Verbesserungsvorschläge zu einer Funktion "KeysForLeftParenthesisWerePressed()", in der verschiedene Tasten mit _IsPressed() abgefragt werden. Es gibt 1 Zeichentaste (Char key) und 3 Steuertasten (Control keys). Damit es nicht zu kompliziert wird (für mich) habe ich die Steuertasten begrenzt auf: Ctrl, Shift und Alt. Den japanischen Hanuta-Keys (richtig: "Hankaku key") habe ich weggelassen, da ich weder einen virtuellen Key-Code zuordnen konnte, noch glaube, dass man ihn zum Schreiben von "(" braucht.
In der Funktion wird die Zeichentaste immer ausgewertet. Zusätzlich wird ermittelt, ob und wieviele Steuertasten ausgewertet werden sollen. Z.B. beim französischen Keyboard-Layout benötigt man nur die Taste 5, um "(" zu schreiben = 0 Steuertasten. Bei deuschen KB-Layout drückt man für "(" die Kombi Shift+8, also 1 Steuertaste, usw. Ob es Tastenkombis gibt, die Ctrl und/oder Alt benutzen um "(" zu schreiben, konnte ich nicht herausfinden.
Kurzbeschreibung
Der Funktion wird 1 Zeichentaste übergeben + 0 bis 3 Steuertasten. Es soll geprüft werden, ob diese Tasten gedrückt wurden. Rückgabe True/False. Wichtig ist, dass dabei auch geprüft werden soll, dass nur die gewünschten Tasten und keine anderen dazu gedrückt werden. Wenn ich wüsste wie, würde ich folgendes programmieren:
If _IsPressed(Zeichentaste) And _IsPressed(Steuertasten) And Not _IsPressed(AndereTasten) Then
Bitte seht euch die Funktion "KeysForLeftParenthesisWerePressed()" mal an und sagt, ob ihr Ideen zur Verbesserung oder Vereinfachung habt.
#include <Array.au3>
#include <Misc.au3>
#include <MsgBoxConstants.au3>
#include <WinAPISys.au3>
Global Const $User32 = DllOpen("User32.dll")
Example()
DllClose($User32)
Func Example()
While 1
Sleep(10)
If KeysForLeftParenthesisWerePressed() Then
MsgBox($MB_SYSTEMMODAL, "", "'(' wurde eingegeben")
ConsoleWrite("'(' wurde eingegeben" & @CRLF)
EndIf
; -------------------------------
; Zum Abbrechen Shift+F1 drücken!
; -------------------------------
If _IsPressed("10") And _IsPressed("70") Then ExitLoop
WEnd
EndFunc
; ==============================================================================
; KeysForLeftParenthesisWerePressed
;
; Diese Routine prüft, ob die Tasten (1 oder mehrere) gedrückt wurden, die zum
; Schreiben einer öffnenden runden Klammer "(" benötigt werden.
;
; Wichtig: Diese Routine wartet mit der weiteren Ausführung des Scripts,
; bis die o.g. Tasten NICHT mehr gedrückt sind!
;
; Das heißt, wenn alle benötigte Tasten gedrückt sind, wird eine
; Schleife gestartet, die solange läuft, bis min. 1 der Tasten NICHT
; mehr gedrückt ist. Erst danach wird das Script weiter ausgeführt.
; ------------------------------------------------------------------------------
Func KeysForLeftParenthesisWerePressed()
Local $aKeyCodes, $aTmpCodes[0]
Local $bLeftParenthesisWasPressed = False
; $aKeyCodes = GetKeyCodesForLeftParenthesis()
; ; [0]: Enthält den virtuellen KeyCode der Zeichentaste als Hex-Wert, den
; ; man z.B. in _IsPressed() benutzen kann.
; ;
; ; [1]-[3]: Enthalten die virtuellen KeyCodes der Steuertasten "Shift", "Ctrl"
; ; und "Alt" als Hex-Wert, den man z.B. in _IsPressed() benutzen kann.
; ;
; ; Die Items 1-3 sind optional, das heißt, das Array kann 1 - 4 Items enthalten.
; Zum Testen ist die Funktion "GetKeyCodesForLeftParenthesis()" nicht verfügbar.
; Deshalb die Werte manuell erzeugen. Zuerst die Zeichentaste, dann die Steuertaste(n).
$aKeyCodes = StringSplit("38|10", "|", $STR_NOCOUNT) ; = 8+Shift = DE KB-Layout für "("
; $aKeyCodes = StringSplit("DB|11|12", "|", $STR_NOCOUNT) ; = ß+AltGr = DE KB-Layout für "\"
Switch UBound($aKeyCodes)
Case 1 ; 0 Steuertasten werden benutzt = 3 Steuertasten sind UNBENUTZT = Temp-Array bekäme 3 Items.
; Alle 3 UNBENUTZEN Steuertasten fest verdrahten.
If _IsPressed($aKeyCodes[0]) _
And Not _IsPressed("10") And Not _IsPressed("11") And Not _IsPressed("12") Then
$bLeftParenthesisWasPressed = True
While _IsPressed($aKeyCodes[0])
Sleep(10)
WEnd
; ConsoleWrite("Case 1: " & $aKeyCodes[0] & " Char: " & Chr(Dec($aKeyCodes[0])) & @CRLF)
EndIf
Case 2 ; 1 Steuertaste wird benutzt = 2 Steuertasten sind UNBENUTZT = Temp-Array bekommt 2 Items.
; Ermittlung der 2 UNBENUTZEN Steuertasten.
If $aKeyCodes[1] <> "10" Then _ArrayAdd($aTmpCodes, "10")
If $aKeyCodes[1] <> "11" Then _ArrayAdd($aTmpCodes, "11")
If $aKeyCodes[1] <> "12" Then _ArrayAdd($aTmpCodes, "12")
If _IsPressed($aKeyCodes[0]) And _IsPressed($aKeyCodes[1]) _
And Not _IsPressed($aTmpCodes[0]) And Not _IsPressed($aTmpCodes[1]) Then
$bLeftParenthesisWasPressed = True
While _IsPressed($aKeyCodes[0]) And _IsPressed($aKeyCodes[1])
Sleep(10)
WEnd
; ConsoleWrite("Case 2: " & $aKeyCodes[1] & @CRLF)
EndIf
Case 3 ; 2 Steuertasten werden benutzt = 1 Steuertaste ist UNBENUTZT = Temp-Array bekommt 1 Item.
; Ermittlung der 1 UNBENUTZEN Steuertaste.
If ($aKeyCodes[1] <> "10") And ($aKeyCodes[2] <> "10") Then _ArrayAdd($aTmpCodes, "10")
If ($aKeyCodes[1] <> "11") And ($aKeyCodes[2] <> "11") Then _ArrayAdd($aTmpCodes, "11")
If ($aKeyCodes[1] <> "12") And ($aKeyCodes[2] <> "12") Then _ArrayAdd($aTmpCodes, "12")
If _IsPressed($aKeyCodes[0]) And _IsPressed($aKeyCodes[1]) And _IsPressed($aKeyCodes[2]) _
And Not _IsPressed($aTmpCodes[0]) Then
$bLeftParenthesisWasPressed = True
While _IsPressed($aKeyCodes[0]) And _IsPressed($aKeyCodes[1]) And _IsPressed($aKeyCodes[2])
Sleep(10)
WEnd
; ConsoleWrite("Case 3: " & $aKeyCodes[1] & " + " & $aKeyCodes[2] & @CRLF)
EndIf
Case 4 ; 3 Steuertasten werden benutzt = 0 Steuertasten sind UNBENUTZT = Temp-Array bekommt 0 Items.
If _IsPressed($aKeyCodes[0]) And _IsPressed("10") And _IsPressed("11") And _IsPressed("12") Then
$bLeftParenthesisWasPressed = True
While _IsPressed($aKeyCodes[0]) And _IsPressed($aKeyCodes[1]) And _IsPressed($aKeyCodes[2])
Sleep(10)
WEnd
; ConsoleWrite("Case 3: " & $aKeyCodes[1] & " + " & $aKeyCodes[2] & @CRLF)
EndIf
EndSwitch
Return $bLeftParenthesisWasPressed
EndFunc ; ==> KeysForLeftParenthesisWerePressed
Alles anzeigen
Edit: Bugs bei der Ermittlung der unbenutzen Steuertasten gefunden und (hoffentlich) behoben.