Abfangen der Enter-Taste beim Input-Control

  • Hey,

    folgendes Problem: Ich habe eine Eingabemaske, bestehend aus mehreren Inputfeldern.
    Sobald man mit Enter die Eingabe bestättigt sollen verschiedene Funktionen aufgerufen werden (Inhalt prüfen, zum nächsten springen usw.)

    Leider bereiten mir die Methoden zum Abfangen der Messagecodes in Verbindung mit der Enter-Taste Probleme :(
    Hier mal ein Skript:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GuiImageList.au3>
    #include <GUIListView.au3>

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

    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <ComboConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 633, 447, 193, 125)
    $Input1 = GUICtrlCreateInput("Input1", 144, 48, 177, 21)
    $hWndi1 = GUICtrlGetHandle($Input1)
    $Input2 = GUICtrlCreateInput("Input2", 144, 96, 177, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    ConsoleWrite("message=" & $hWnd & @CRLF & $iMsg & @CRLF & $iwParam & @CRLF & $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    ConsoleWrite("icode=" & $iCode & @CRLF)
    ConsoleWrite("iIDForm=" & $iIDFrom & @CRLF)
    ConsoleWrite("hwnd=" & $hWndFrom & @CRLF)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16)
    ConsoleWrite("iIParam=" & $hWndFrom & @CRLF)
    ConsoleWrite("iIDForm=" & $iIDFrom & @CRLF)
    ConsoleWrite("icode=" & $iCode & @CRLF)
    Switch $iIDFrom
    Case $Input1
    Switch $iCode
    Case 0 ; $icode für Enter?
    MsgBox(1, "Input1", "WM_Command")
    EndSwitch
    case $Input2
    Switch $iCode
    Case 0 ; $icode für Enter?
    MsgBox(1, "Input2", "WM_Command")
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]

    Nach langem Suchen in den includes meine ich das richtige gefunden zu haben (aus der Structureconstants.au3):

    [autoit]


    ; #STRUCTURE# ===================================================================================================================
    ; Name...........: $tagNMCBEENDEDIT
    ; Description ...: Contains information about the conclusion of an edit operation within a ComboBoxEx control
    ; Fields ........: $tagNMHDR - Contains information about a notification message
    ; fChanged - Indicating whether the contents of the control's edit box have changed
    ; NewSelection - The zero-based index of the item that will be selected after completing the edit operation
    ; +This value can be $CB_ERR if no item will be selected
    ; Text - A zero-terminated string that contains the text from within the control's edit box
    ; Why - The action that generated the $CBEN_ENDEDIT notification message
    ; +This value can be one of the following:
    ; |$CBENF_DROPDOWN - The user activated the drop-down list
    ; |$CBENF_ESCAPE - The user pressed ESC
    ; |$CBENF_KILLFOCUS - The edit box lost the keyboard focus
    ; |$CBENF_RETURN - The user completed the edit operation by pressing ENTER
    ; Author ........: Gary Frost (gafrost)
    ; Remarks .......:
    ; ===============================================================================================================================
    Global Const $tagNMCBEENDEDIT = $tagNMHDR & ";int fChanged;int NewSelection;char Text[1024];int Why"

    [/autoit]

    Nur leider klappt die Umsetzung nicht, $WM_Notify liefert gar nichts und $WM_Command liefert (s. Skript)

    iIParam=0x00000000
    iIDForm=1
    icode=0

    ?(

    Vielleicht hat ja jemand einen Tipp für mich?

    Gruß nuts

    edit \ Hab oben ein $WM_Command Lösung editiert.
    Mit der Struktur kämpfe ich noch :wacko:

    2 Mal editiert, zuletzt von nuts (2. September 2009 um 12:40)

  • Moin nuts,

    Spoiler anzeigen
    [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    $hWndFrom = $ilParam
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16)
    ConsoleWrite("iIParam=" & $hWndFrom & @CRLF)
    ConsoleWrite("iIDForm=" & $iIDFrom & @CRLF)
    ConsoleWrite("icode=" & $iCode & @CRLF)
    Switch $iIDFrom
    Case $Input1
    Switch $iCode
    Case 0 ; $icode für Enter? Ja!!! ;)
    MsgBox(1, "Input1", "WM_Command")
    EndSwitch
    case $Input2
    Switch $iCode
    Case 0 ; $icode für Enter? Ja !!! ;)
    MsgBox(1, "Input2", "WM_Command")
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    ... oder einfacher ...

    Spoiler anzeigen
    [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)

    Switch (LOWORD($iwParam))

    Case $Input1
    Switch (HIWORD($iwParam))
    Case 0 ; $icode für Enter? Ja !!! ;)
    MsgBox(1, "Input1", "WM_Command")
    EndSwitch

    Case $Input2
    Switch (HIWORD($iwParam))
    Case 0 ; $icode für Enter? Ja !!! ;)
    MsgBox(1, "Input2", "WM_Command")
    EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG

    EndFunc ;==>WM_COMMAND

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

    Func LOWORD($DWORD)
    Return BitAND($DWORD, 0xFFFF)
    EndFunc

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

    Func HIWORD($DWORD)
    Return BitShift($DWORD, 16)
    EndFunc

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

    ...oder noch einfacher ...

    Spoiler anzeigen
    [autoit]

    While (TRUE)

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

    Switch (GUIGetMsg(FALSE))
    Case $Input1
    ContinueCase
    Case $Input2
    MsgBox(1, "Input", "Enter!")
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]


    EDIT: Sorry, habe mich im ersten Bsp. vertan, ist natürlich beides richtig!


    Gruß
    Greenhorn


    4 Mal editiert, zuletzt von Greenhorn (2. September 2009 um 11:57)

  • Danke für die Beteiligung, Lösung 1 & 2 entsprechen auch meiner. Lösung 3 ist etwas seltsam funktioniert aber :thumbup:

    Der "Struktur-Teil" würde nur mit einem Edit funktionieren, ist extrem langsam (kann das sein?) und die Konstante $CBENF_RETURN ist unauffindbar.

  • Hallo nuts,
    ggf gibt es eine einfachere Lösung als die Abfrage per Messagecodes.
    Ich verwende für die Eingabe in Input-Feldern einen (ggf unsichtbaren) Button, der "angeklickt" wird, sobald die Enter-Taste betätigt wird. Schau mal bei

    [autoit]

    _GUICtrlButton_Create()

    [/autoit]

    nach dem Parameter $BS_DEFPUSHBUTTON.
    ciao
    Andy

  • Ist auch eine Möglichkeit, bei meiner Eingabemaske haben auch noch 2 andere Tasten (+/-) eine Funktion (Feldzurück, direktes Senden aller Inputinfos). Somit muss es wohl schon eine Abfrage der Messagecodes sein, für die Enter-Taste ist aber trotzdem eine sehr gute Idee :thumbup:

    Bin gestern Nacht etwas durcheinandergekommen mit dem Abfragen von Listview+ Enter, DllStructCreate usw. :whistling:
    WM_Command klappt jetzt zum Glück wieder :thumbup: