Event "Wenn irgendeine Taste gedrückt" für Input oder Edit Control

  • Hallo,
    ich möchte das drücken irgendeiner Taste innerhalb eines Input Controls oder Edit Controls abfangen. Bisher bin ich nur auf WM_KEYDOWN gestoßen, welches für Edit Controls belegt sein soll, aber ka wie ich das registrieren muss usw.
    Benötige bitte Hilfe!
    Vielen dank schonmal

  • Probiere es mal mit dem $WM_COMMAND -> z.B. GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

    Gruß,
    UEZ

    PS: ich habe es eben auch gebraucht, um zu prüfen, ob ein Input Feld nicht leer ist. Man muss ja nicht gleich den Teufel an die Wand malen...

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Also ich programmiere für die Arbeit eine Lagerverwaltung und möchte eine Indexierung, ähnlich wie bei google.de programmieren. Also ich gib in mein Control z.B. Kabel ein und bekommen dann schon Vorschläge in einem layer angezeigt, z.B. "Kabel, rot"
    "Kabel, blau" usw. und umso mehr ich eingebe umso kleiner wird die Anzeige.

    Danke für deinen post UEZ
    aber genau ab da komm ich nicht weiter, weil ich das ganze Konstrukt überhaupt nicht verstehe.
    also ich habe meine Input Control:

    $Input1 = GUICtrlCreateInput("", 56, 48, 121, 21)

    GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")

    ab hier verstehs ichs einfach nicht mehr. Könntest du mir bitte den weiteren code schreiben und oder das erklären, die ganzen parameter etc. ?(

    _WM_COMMAND(???)
    ???

  • Aber ich versteh den Code innerhalb der Funktionen nicht:

    [autoit]

    Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Local $hCtrl = $lParam
    Local $sText = ""

    Switch $hCtrl
    Case $btn, $rdo, $chk ; hier jetzt $Input eingeben oder wie bitte ?
    ; und wie gehts dann weiter?

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

    Switch $nNotifyCode
    Case $BN_CLICKED
    $sText = "$BN_CLICKED" & @CRLF
    Case $BN_PAINT
    $sText = "$BN_PAINT" & @CRLF
    Case $BN_PUSHED, $BN_HILITE
    $sText = "$BN_PUSHED, $BN_HILITE" & @CRLF
    Case $BN_UNPUSHED, $BN_UNHILITE
    $sText = "$BN_UNPUSHED" & @CRLF
    Case $BN_DISABLE
    $sText = "$BN_DISABLE" & @CRLF
    Case $BN_DBLCLK, $BN_DOUBLECLICKED
    $sText = "$BN_DBLCLK, $BN_DOUBLECLICKED" & @CRLF
    Case $BN_SETFOCUS
    $sText = "$BN_SETFOCUS" & @CRLF
    Case $BN_KILLFOCUS
    $sText = "$BN_KILLFOCUS" & @CRLF
    EndSwitch
    MemoWrite($sText & _
    "-----------------------------" & @CRLF & _
    "WM_COMMAND - Infos:" & @CRLF & _
    "-----------------------------" & @CRLF & _
    "Code" & @TAB & ":" & $nNotifyCode & @CRLF & _
    "CtrlID" & @TAB & ":" & $nID & @CRLF & _
    "CtrlHWnd:" & $hCtrl & @CRLF & _
    _GUICtrlButton_GetText($hCtrl) & @CRLF)
    Return 0 ; Only workout clicking on the button
    EndSwitch
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]

    Soweit ich das verstehe, fängt die Funktionen jetzt Events von Buttons ab, aber wie ich das mit input controls mache bleibt mir ein rätsel.
    Vielleicht so:

    [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    If Not IsHWnd($hEdit) Then $hWndEdit = GUICtrlGetHandle($hEdit)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
    Case $hEdit, $hWndEdit ; statt Edit einfach $Input1 ?
    Switch $iCode
    Case $EN_CHANGE ; Sent when the user has taken an action that may have altered text in an edit control
    _DebugPrint("$EN_CHANGE" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
    "-->IDFrom:" & @TAB & $iIDFrom & @LF & _
    "-->Code:" & @TAB & $iCode)
    ; no return value
    EndSwitch
    MemoWrite($sText & _
    "-----------------------------" & @CRLF & _
    "WM_COMMAND - Infos:" & @CRLF & _
    "-----------------------------" & @CRLF & _
    "Code" & @TAB & ":" & $nNotifyCode & @CRLF & _
    "CtrlID" & @TAB & ":" & $nID & @CRLF & _
    "CtrlHWnd:" & $hCtrl & @CRLF & _
    _GUICtrlButton_GetText($hCtrl) & @CRLF)
    Return 0 ; Only workout clicking on the button
    EndSwitch
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]

    2 Mal editiert, zuletzt von Trolleule (30. April 2010 um 00:05)

  • Hallo Trolleule,
    für Input- oder Edit-Controls ist m.E. das einfachste ein

    [autoit]

    GuiCtrlRead()

    [/autoit]

    . Den Inhalt kannst du mit den möglichen Begriffen vergleichen. Ob du deine "Vorschläge" in einen String oder in ein Array packst, ist egal.
    Die Frage ist jetzt, ob in deinem Beispiel mit "Kabel" nicht nur Kabelschuh und Kabelbinder, sondern auch Massekabel oder sogar Fädeldraht gefunden werden sollen....

    Ggf könnte man sogar ähnliche bzw falsch geschriebene Begriffe filtern, Stichwort Levenshtein-distanz.