Edit verweigert eingabe (maximale Anzahl der Zeilen überschritten?)

  • Guten Abend,

    Ich habe mir aus langeweile eine kleines Script geschrieben, welches das Copy & Pasten in der Windows Console erleichtern soll.

    Script
    [autoit]

    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #Include <GuiEdit.au3>
    #include <Misc.au3>
    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <ScrollBarConstants.au3>

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

    Global $iHoehe_Max = 900
    Global $iBreite_Max = 900
    Global $iHoehe_Min = 300
    Global $iBreite_Min = 300

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

    Global $stitle = "Cmd for easy Copy & Paste"
    Global $hdll = DllOpen("user32.dll")

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

    $hWindow = GUICreate($stitle,$iBreite_Min,$iHoehe_Min,"","",BitOR($WS_SIZEBOX,$WS_SYSMENU,$WS_MINIMIZEBOX,$WS_MAXIMIZEBOX,$WS_CAPTION))
    GUISetBkColor(0x000000)
    GUICtrlSetDefColor(0xFFFFFF)
    GUICtrlSetDefBkColor(0x000000)
    $cEdit = GUICtrlCreateEdit("dir",20,20,260,260,BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL))
    GUICtrlSetResizing(-1, $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT + $GUI_DOCKRIGHT)
    GUISetState(@SW_SHOW,$hWindow)

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

    GUIRegisterMsg($WM_GETMINMAXINFO,"MY_WM_GETMINMAXINFO")

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

    While 1
    $smsg = GUIGetMsg()
    If $smsg = -3 Then Exit
    If _IsPressed("0D", $hdll) And WinActive($stitle) Then
    $sText = _GUICtrlEdit_GetLine($cEdit,_GUICtrlEdit_GetLineCount($cEdit)-2)
    $hDos = Run(@ComSpec & " /c " & $sText, @SystemDir, @SW_HIDE,$STDERR_MERGED)
    Local $sRead="",$sTmp=""
    While 1
    $sTmp = StdoutRead($hDos)
    If @error Then ExitLoop
    $sRead &= $sTmp
    WEnd
    If $sRead <> "" Then
    $sOld = GUICtrlRead($cEdit)
    GUICtrlSetData($cEdit,$sOld & $sRead)
    _GUICtrlEdit_Scroll($cEdit,$SB_SCROLLCARET )
    Else
    _GUICtrlEdit_Undo($cEdit)
    EndIf
    EndIf
    WEnd

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

    Func MY_WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam)
    $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, $iBreite_Min) ; min X
    DllStructSetData($minmaxinfo, 8, $iHoehe_Min) ; min Y
    DllStructSetData($minmaxinfo, 9, $iBreite_Max) ; max X
    DllStructSetData($minmaxinfo, 10, $iHoehe_Max) ; max Y
    Return 0
    EndFunc ;==>MY_WM_GETMINMAXINFO

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

    Das Script funktioniert auch soweit, aber wenn ich jetzt das Script starte und den Befehl dir ausführe und am Ende einen neuen Befehl hineinschreiben will, wird mir die Eingabe verweigert bzw. ich sehe meine Eingabe nicht.

    Ich denke ich habe die maximale Zeilen-Anzahl des Edit's errreicht oder seht ihr in meinem Script einen Fehler?

    Vielen Dank für die Hilfe im Voraus

    Lg, Fabian

    Einmal editiert, zuletzt von Fabian (11. September 2010 um 11:40)

  • Hi,

    baue bitte mal diese Funktion ein, dann hast Du Gewissheit ...

    Spoiler anzeigen
    [autoit]


    GUIRegisterMsg ($WM_COMMAND, "WM_COMMAND")

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

    ; ...

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

    Func WM_COMMAND ($hwnd, $message, $wParam, $lParam)

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

    If ($lParam and LOWORD($wParam) == $cEdit) Then

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

    ; Nachrichten des Eingabefeldes
    Switch (HIWORD($wParam))

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

    Case $EN_ERRSPACE
    ContinueCase
    Case $EN_MAXTEXT
    MsgBox (BitOR ($MB_OK, $MB_ICONSTOP), _
    $sTitle, "Kapazitätsgrenze erreicht.")
    EndSwitch
    EndIf

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

    Return $GUI_RUNDEFMSG

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

    EndFunc

    [/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]


    ... und um das Limit zu ändern ...

    [autoit]


    ; Textlimit festlegen: 1 MB ANSI; 2 MB Unicode (UTF-16)
    GUICtrlSendMsg ($IDC_EDIT, $EM_LIMITTEXT, 1024 ^ 2, 0)

    [/autoit]

    Gruß
    Greenhorn


  • Hallo,

    Zitat von http://msdn.microsoft.com/en-us/library/bb761607%28v=VS.85%29.aspx

    Before EM_LIMITTEXT is called, the default limit for the amount of text a user can enter in an edit control is 32,767 characters.

    Bei mir waren es allerdings auch schon mal exakt 32.000 Zeichen.

    Der Aufruf von

    [autoit]

    GUICtrlSendMsg(-1, $EM_LIMITTEXT, 0, 0)

    [/autoit]

    reicht jedoch aus, um die Kapazität auf die Maximalwerte der OS-Version zu setzen.

  • [autoit]

    _GUICtrlEdit_SetLimitText($cEDIT,0)

    [/autoit]

    Das unter das editfeld und du hast kein Limit mehr...

  • Greenhorn
    Vielen Dank, habe die Funktion eingebaut und meine Vermutung war richtig, die Grenze wurde erreicht.

    @Großvater & @Sir En
    Beide Vorschläge funktionieren einwandfrei und der Eingabe des Benutzers steht nichts mehr im Weg :)

    Lg, Fabian