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
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
Func CMDpause()
CMDread()
EndFunc ;==>CMDpause
Func CMDclose()
WinClose(@ScriptDir & "\" & @ScriptName)
WinKill(@ScriptDir & "\" & @ScriptName)
EndFunc ;==>CMDclose
Func CMDwrite($text)
$text = $text & @CRLF
Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CMDCharToOem($text))
Return SetError(@error, @extended, $temp)
EndFunc ;==>CMDwrite
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
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
Return SetError(1, 0, "")
EndFunc ;==>OemToChar
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
Return SetError(1, 0, "")
EndFunc ;==>CharToOEM
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?