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
Event "Wenn irgendeine Taste gedrückt" für Input oder Edit Control
-
- [ offen ]
-
Trolleule -
29. April 2010 um 22:40 -
Geschlossen -
Erledigt
-
-
Sry aber wofür brauchst du diese Funktion? Es hört sich nämlich gewaltig nach nem Keylogger an...
-
Probiere es mal mit dem $WM_COMMAND -> z.B. GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
Gruß,
UEZPS: 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...
-
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(???)
??? -
Suche mal in der Hilfe nach "WM_COMMAND". Dort sind einige Beispiele angegeben.
Oder schaue mal hier: Integer <=> Binary Converter v1.0 Build 2010-01-15 (Schleichwerbung )
Gruß,
UEZ -
Aber ich versteh den Code innerhalb der Funktionen nicht:
[autoit]Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
[/autoit][autoit][/autoit][autoit]
#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?Switch $nNotifyCode
[/autoit]
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_COMMANDSoweit 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.
[autoit]
Vielleicht so:Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
#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 -
- Offizieller Beitrag
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.
Eine eingabesensitive Anzeige, habe ich mal so gelöst: IntelliSenseBox -
Hallo Trolleule,
[autoit]
für Input- oder Edit-Controls ist m.E. das einfachste einGuiCtrlRead()
[/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.