Funktion auführen, egal welche Taste gedrückt wird

  • Hallo,
    ich würde gerne eine Funktion aufrufen, wenn irgendeine Taste der Tastatur gedrückt wird.
    Diese Taste möchte ich der Funktion noch mit übergeben.
    Es spielt keine Frage ob es klein oder groß geschrieben ist.

    Nun könnte ich zich Hotkeys setzten oder _IsPressed abfragen aufbauen.

    Gibt es eine elegantere Lösung ?


    So stelle ich mir das vor:

    Spoiler anzeigen
    [autoit]


    while 1
    ;hier die unbekannte funktion
    wend

    [/autoit] [autoit][/autoit] [autoit]

    func aufruf($key)
    ...
    endfunc

    [/autoit]

    Grüße Tim

  • Habe das Skript doch mal wieder raus genommen da ich jetzt erst gelesen habe dass du dich auf ein Control beziehst.

    Dafür sind die Windows Messages gedacht, WM_KEYDOWN & WM_KEYUP << Einfach mal googeln.

    3 Mal editiert, zuletzt von Yjuq (10. März 2015 um 18:04)

  • Da es sich auf deine eigene GUI beschränkt, wären Windows-Messages:

    [autoit]

    GUICreate("", 300, 200)
    GUIRegisterMsg(0x0101, WM_KEYUP)
    GUISetState()

    [/autoit][autoit][/autoit][autoit]

    Do
    Until GUIGetMsg() = -3

    [/autoit][autoit][/autoit][autoit]

    Func WM_KEYUP($hWnd, $msg, $wParam, $lParam)
    ConsoleWrite("Key pressed" & @CRLF)
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_KEYUP

    [/autoit]

    Probleme könnte es geben sobald ein Edit-Control in der GUI steckt - dieses fängt die Messages ab.

  • Das hier sollte genau das machen was du willst (gib mal "AutoIt" ein):

    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit][autoit][/autoit][autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiRichEdit.au3>
    #include <WinAPI.au3>
    #include <WinAPIConstants.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $CALLBACK_RichBox = DllCallbackRegister(RichBox_WndProc, 'lresult', 'hwnd;uint;wparam;lparam')
    Global $hGUI, $hRichBox, $pRichBox_WndProc

    [/autoit][autoit][/autoit][autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit][autoit][/autoit][autoit]

    $hGUI = GUICreate('', 800, 600)
    $hRichBox = _GUICtrlRichEdit_Create($hGUI, '', 0, 0, 800, 600)
    _GUICtrlRichEdit_SetFont($hRichBox, 16, 'Comic Sans MS')
    $pRichBox_WndProc = _WinAPI_SetWindowLong($hRichBox, $GWL_WNDPROC, DllCallbackGetPtr($CALLBACK_RichBox))
    GUISetState()

    [/autoit][autoit][/autoit][autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit][autoit][/autoit][autoit]

    While GUIGetMsg() <> $GUI_EVENT_CLOSE
    WEnd

    [/autoit][autoit][/autoit][autoit]

    DllCallbackFree($CALLBACK_RichBox)

    [/autoit][autoit][/autoit][autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit][autoit][/autoit][autoit]

    Func EvaluateKey($hWnd, $iKeycode)
    Local $aSyntax[] = ['autoit']
    Local Static $sBuffer
    Local $i

    [/autoit][autoit][/autoit][autoit]

    Switch $iKeycode
    Case 0x41 To 0x5A ; A to Z
    $sBuffer &= Chr($iKeycode)
    Case 0x08, 0x09, 0x20 ; Backspace and Whitespace
    $sBuffer = ''
    EndSwitch

    [/autoit][autoit][/autoit][autoit]

    For $i = 0 To UBound($aSyntax) -1
    If $aSyntax[$i] = $sBuffer Then Return SetTextColor($hWnd, StringLen($sBuffer))
    Next
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func SetTextColor($hWnd, $iLen)
    Local $iSel = _GUICtrlRichEdit_GetSel($hWnd)[0]

    [/autoit][autoit][/autoit][autoit]

    _GUICtrlRichEdit_SetSel($hWnd, $iSel - $iLen +1, $iSel +1)
    _GUICtrlRichEdit_SetCharBkColor($hWnd, 0x00FFFF)
    _GUICtrlRichEdit_Deselect($hWnd)
    _GUICtrlRichEdit_SetCharBkColor($hWnd)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit][autoit][/autoit][autoit]

    Func RichBox_WndProc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
    Case $WM_KEYDOWN
    EvaluateKey($hWnd, $wParam)
    EndSwitch

    [/autoit][autoit][/autoit][autoit]

    Return _WinAPI_CallWindowProc($pRichBox_WndProc, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]
  • Dann benutzt du noch eine ältere Version,...
    Zeile 30 ändern in: Local $aSyntax[1] = ['autoit']
    Zeile 48 ersetzen durch:

    [autoit]

    Local $iSel = _GUICtrlRichEdit_GetSel($hWnd)
    $iSel = $iSel[0]

    [/autoit]
  • Du hast noch eine ältere AutoIt-Version.
    Zeile 30 wird ein Array mit einem Element erstellt ohne die Array-Größe explizit anzugeben.
    In Zeile 47 wird das von _GUICtrlRichEdit_GetSel zurückgegebene Array statt in eine temporäre Variable zwischenzuspeichern direkt ohne eine solche angesprochen.

  • Ach stimmt,... vergessen... ^^
    Zeile 9 ersetzen durch: Global Const $CALLBACK_RichBox = DllCallbackRegister('RichBox_WndProc', 'lresult', 'hwnd;uint;wparam;lparam')

  • Das Script welches ich geschrieben habe funktioniert soweit schon nicht ganz schlecht ;)
    Nur würde ich es gerne beim Einlesen noch etwas geschwindigkeitsoptimiert haben wollen, aber dafür bin ich wohl zu doof :)

    Einen Bug den ich nicht rausbekomme, der aber manchmal da ist, ist wenn ich mit enter in eine neue Zeile gehe, dann ist meine Schrift plötzlich wieder kleiner und nicht wie ich sie von anfang an gesetzt habe. Das verwirrt mich. Es passiert eben nur manchmal.. Das Highlighting geht dann aber dennoch..

    Spoiler anzeigen
    [autoit]

    #comments-start
    TODO:

    [/autoit] [autoit][/autoit] [autoit]

    #comments-end

    [/autoit] [autoit][/autoit] [autoit]

    #include <GuiRichEdit.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <array.au3>
    #include <misc.au3>

    [/autoit] [autoit][/autoit] [autoit]

    global $count = 0
    global $iCpStart = 200
    global $merker = 0
    global $size = 6
    global $inhalt
    global $titel = "SQL Syntax Highlighter"
    global $sBuffer

    [/autoit] [autoit][/autoit] [autoit]

    global $color1 = 0xc6178a
    global $syn1[$size]
    $syn1[0] = "SELECT"
    $syn1[1] = "FROM"
    $syn1[2] = "WHERE"
    $syn1[3] = "ORDER"
    $syn1[4] = "BY"

    [/autoit] [autoit][/autoit] [autoit]

    global $color2 = 0x66c051
    global $syn2[$size]
    $syn2[0] = "OR"
    $syn2[1] = "AND"
    $syn2[2] = "NOT"

    [/autoit] [autoit][/autoit] [autoit]

    global $color3 = 0xde635a
    global $syn3[$size]
    $syn3[0] = "IN"
    $syn3[1] = "OUTER"
    $syn3[2] = "INNER"
    $syn3[3] = "JOIN"
    $syn3[4] = "LIKE"
    $syn3[5] = "BETWEEN"

    [/autoit] [autoit][/autoit] [autoit]

    global $color4 = 0x636363
    global $syn4[$size]
    $syn4[0] = "IS"
    $syn4[1] = "NULL"
    $syn4[2] = "="
    $syn4[3] = "<"
    $syn4[4] = ">"

    [/autoit] [autoit][/autoit] [autoit]

    global $color5 = 0x0034f6
    global $syn5[$size]
    $syn5[0] = "("
    $syn5[1] = ")"
    $syn5[2] = ";"
    $syn5[3] = '"'
    $syn5[4] = "'"

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate($titel, 700, 460, -1, -1)
    $hRichEdit = _GUICtrlRichEdit_Create($hGui, "", 10, 10, 680, 400, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL))
    _GUICtrlRichEdit_SetFont($hRichEdit, 15, "CALIBRI")
    $save = GUICtrlCreateButton("&Speichern",10,420,100,30)
    $open = GUICtrlCreateButton("Ö&ffnen",120,420,100,30)
    $labeltim = GUICtrlCreateLabel("(c) Tim Erler",630,430,80,20)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ;~ HotKeySet(" ","space")

    [/autoit] [autoit][/autoit] [autoit]

    While True

    [/autoit] [autoit][/autoit] [autoit]

    $aktuelle_l = StringLen(_GUICtrlRichEdit_GetText($hRichEdit))
    sleep(50)
    $aktuelle_2 = StringLen(_GUICtrlRichEdit_GetText($hRichEdit))
    if $aktuelle_l <> $aktuelle_2 then space()

    [/autoit] [autoit][/autoit] [autoit]

    $iMsg = GUIGetMsg()
    Select
    Case $iMsg = $GUI_EVENT_CLOSE
    _GUICtrlRichEdit_Destroy($hRichEdit) ; needed unless script crashes

    [/autoit] [autoit][/autoit] [autoit]

    Exit
    Case $iMsg = $save
    if FileWrite(FileOpenDialog("Speicherort wählen",@DesktopDir,"Textdateien (*.txt)")&".txt",_GUICtrlRichEdit_GetText($hRichEdit)) Then
    MsgBox(0,"Speichern","Wurde erfolgreich gespeichert")
    Else
    MsgBox(0,"Speichern","Fehler beim Speichern")
    EndIf
    Case $iMsg = $open
    $inhalt = FileRead(FileOpenDialog("Datei öffnen",@DesktopDir,"Textdateien (*.txt)"))
    if @error = 1 Then
    MsgBox(0,"Speichern","Fehler beim Öffnen")
    Else
    dataopen()
    EndIf
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    func space()

    [/autoit] [autoit][/autoit] [autoit]

    If WinGetState($titel) = 15 then

    [/autoit] [autoit][/autoit] [autoit]

    $arr = _GUICtrlRichEdit_GetSel($hRichEdit) ;schauen ob nichts mrkiert ist
    if $arr[0] == $arr[1] then
    $letztes = $arr[0]

    [/autoit] [autoit][/autoit] [autoit]

    $iCpStart = _GUICtrlRichEdit_GetCharPosOfPreviousWord($hRichEdit, $letztes) ;gibt startposition meines letztes wortes aus
    ConsoleWrite($iCpStart&"-"&$arr&@CRLF)
    $wort = _GUICtrlRichEdit_GetTextInRange($hRichEdit, $iCpStart, $letztes) ;text in der position auslesen
    $wort = StringReplace($wort," ","")
    $wort = StringReplace($wort,");",";")
    $wort = StringReplace($wort,"';",";")
    $wort = StringReplace($wort,'";',";")
    ;~ MsgBox(0,"",$wort)
    ConsoleWrite($wort&@CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================
    for $counter = 0 to $size-1 ;Eines minus weil array bei 0 beginnt
    if $wort = $syn1[$counter] Then ;Ob das Wort in liste synb ist
    ;~ MsgBox(0,"","asd")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color1) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    ;~ MsgBox(0,"","fertig")
    $merker = 1
    ExitLoop
    elseif $wort = $syn2[$counter] Then ;Obb das Wort in liste synr ist
    ;~ MsgBox(0,"","asd")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color2) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    ;~ MsgBox(0,"","fertig")
    $merker = 1
    ExitLoop
    elseif $wort = $syn3[$counter] Then ;Obb das Wort in liste synr ist
    ;~ MsgBox(0,"","asd")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color3) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    ;~ MsgBox(0,"","fertig")
    $merker = 1
    ExitLoop
    elseif $wort = $syn4[$counter] Then ;Obb das Wort in liste synr ist
    ;~ MsgBox(0,"","asd")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color4) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    ;~ MsgBox(0,"","fertig")
    $merker = 1
    ExitLoop
    elseif $wort = $syn5[$counter] Then ;Obb das Wort in liste synr ist
    ;~ MsgBox(0,"","asd")

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color5) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    ;~ MsgBox(0,"","fertig")
    $merker = 1
    ExitLoop
    else;wenn das wort nicht drinnen ist, wird wieder zurück geschrieben
    if $merker == 0 then
    ;~ MsgBox(0,"","neu")
    _GUICtrlRichEdit_SetSel($hRichEdit, $iCpStart, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, 0x000000) ;die Farbe verändern
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    _GUICtrlRichEdit_SetSel($hRichEdit, $letztes+1, $letztes+1) ;text markieren
    EndIf
    endif
    ;~ MsgBox(0,"","nochmal")
    next
    $merker = 0 ;zurücksetzten bevor es erneut durch geht
    ;===================================================================================

    [/autoit] [autoit][/autoit] [autoit]

    Else ; = error meldung wenn etwas markiert
    MsgBox(16,"not","kot")
    endif

    [/autoit] [autoit][/autoit] [autoit]

    Else ;wenn das Fenster nicht im Vordergrund ist
    HotKeySet(" ")
    Send("{SPACE}")
    HotKeySet(" ","space")
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func dataopen()

    [/autoit] [autoit][/autoit] [autoit]

    ;==========Daten rein laden
    _GUICtrlRichEdit_SetText($hRichEdit,$inhalt)
    _GUICtrlRichEdit_SetSel($hRichEdit, 0,-1) ;text markieren
    _GUICtrlRichEdit_SetFont($hRichEdit, 15, "CALIBRI")
    _GUICtrlRichEdit_Deselect($hRichEdit) ; die Markierung aufheben
    ;==========Daten rein laden

    [/autoit] [autoit][/autoit] [autoit]

    $zeichenzahl = StringLen($inhalt)
    ;~ MsgBox(0,"",$zeichenzahl)

    [/autoit] [autoit][/autoit] [autoit]

    for $zahler = 0 to $zeichenzahl

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $zahler,$zahler) ;text anfang setzten
    $zeichen = _GUICtrlRichEdit_GetTextInRange($hRichEdit, $zahler,$zahler+1)
    ConsoleWrite($zeichen)
    space()
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Noch eine getrennte Frage für sich. Kann ich die Textfarbe ändern, ohne den Text markieren zu müssen ?

    [autoit]

    _GUICtrlRichEdit_SetSel($hRichEdit, $erstes, $letztes) ;text markieren
    _GUICtrlRichEdit_SetCharColor($hRichEdit, $color1) ;die Farbe verändern

    [/autoit]