CMD - Während Benutzereingabe Text hinzufügen

  • Hey,
    Ich möchte mit dem CMD eine Art Konsole für meinen Server machen. Im CMD sollen alle Ereignisse gezeigt werden und wenn der User was schreibt sollen bei bestimmten Texten Funktionen ausgeführt werden.

    Hier meine Funktionen:

    Spoiler anzeigen
    [autoit]


    Func CMDstart($ExitOnFatal = True)
    If Not _WinAPI_AttachConsole() Then
    $ret = DllCall("Kernel32.dll", "long", "AllocConsole")
    If $ret = 0 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("Could not allocate Console")
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Global $GLOBAL_hConsole = _WinAPI_GetStdHandle(1)
    If $GLOBAL_hConsole = -1 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Output failed")
    Return SetError(2, 0, 0)
    EndIf
    Global $GLOBAL_hConsoleIn = _WinAPI_GetStdHandle(0)
    If $GLOBAL_hConsoleIn = -1 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Input failed")
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>CMDstart

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

    Func CMDpause()
    CMDread()
    EndFunc ;==>CMDpause

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

    Func CMDclose()
    WinClose(@ScriptDir & "\" & @ScriptName)
    WinKill(@ScriptDir & "\" & @ScriptName)
    EndFunc ;==>CMDclose

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

    Func CMDwrite($text)
    $text = $text & @CRLF
    Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CMDCharToOem($text))
    Return SetError(@error, @extended, $temp)
    EndFunc ;==>CMDwrite

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

    Func CMDread()
    Local $test = DllStructCreate("char[10000]")
    Local $read = 5000
    Local $temp = _WinAPI_ReadFile($GLOBAL_hConsoleIn, DllStructGetPtr($test), DllStructGetSize($test), $read)
    If @error Then Return SetError(@error, @extended, $temp)
    Return CMDOemToChar(DllStructGetData($test, 1))
    EndFunc ;==>_CMD_READ

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

    Func CMDOemToChar($szSrc)
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str", $placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0, 0, $lRetVal[2])
    EndIf

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

    Return SetError(1, 0, "")
    EndFunc ;==>OemToChar

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

    Func CMDCharToOEM($szSrc)
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "CharToOem", "str", $szSrc, "str", $placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0, 0, $lRetVal[2])
    EndIf

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

    Return SetError(1, 0, "")
    EndFunc ;==>CharToOEM

    [/autoit]

    Es funktioniert gut bis auf eine Macke:
    Der User kann nur schreiben wenn CMDread ausgeführt wird, allerdings während dieser Befehl ausgeführt wird kann der Server nicht weiterlaufen was zu Laggs führt. Wenn CMDread jedoch nicht ausgeführt wird kann der User im CMD nicht schreiben ...

    Hat jemand eine Lösung?

  • Hallo,

    ich bin mir nicht sicher ob ich das Problem richtig verstehe

    Was wäre, wenn du mithilfe von Hotkeys eine Art Keylogger erstellst, der dann bei Enter den String überprüft und ausführt?

    Edit: hier ne kurze verdeutlichung:

    pseudo code:

    [autoit]


    $string

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

    HotkeySet("e","_e")

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

    func _e ()

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

    $string += "e"
    send("e")
    endfunc

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

    func _enter()
    consolewrite($string)
    _serverDo($string)
    endfunc

    [/autoit]

    ist halt ein bischen arbeit

    Einmal editiert, zuletzt von zombie36 (22. August 2011 um 00:03)

  • Das würde zwar gehen, würde aber eher schlecht aussehen, da das typische CMD-Eingabefeld dann nicht da ist und der User glaubt er schreibt nicht mal ^^.
    Aber danke für die Antwort.

  • Du könntest dir auch eine eigene Console machen und nur bei vollendeter eingabe dan den jeweiligen Befehl ausführen.