Konsole: Input reagiert erst beim zweiten mal ?
Verfasst: 13.04.2010 17:42
Mein Programm soll sowohl über Fenster als auch über die Konsole steuerbar sein. Ich prüfe deshalb am Anfang per ProgramParameter(), ob der Benutzer den Konsole-Modus will und ob diese überhaupt vorhanden ist. Dabei ist OpenConsole() sinnlos, weil ja die bereits geöffnete benutzt werden soll.
Folgender Code zeigt meinen bisherigen Fortschritt; zum Testen normal als "Windows"-Executable kompilieren und dann per Konsole öffnen:
Mein Problem ist nun, dass der ConsoleInput()-Befehl, welcher wie der von PureBasic funktionieren soll, nicht korrekt funktioniert. Gebe ich bei meinem Beispiel "abc" ein, kommt die Meldung "Der Befehl 'abc' ist entweder falsch [...]" und erst darauf kann ich einen Buchstaben eingeben, der dann sofort ausgegeben wird.
Weiß jemand wo der Fehler liegt bzw. wie ich eine richtig funktionierende Input-Funktion bekomme?
Folgender Code zeigt meinen bisherigen Fortschritt; zum Testen normal als "Windows"-Executable kompilieren und dann per Konsole öffnen:
Code: Alles auswählen
Global ConsoleRID, ConsoleWID, ConsoleOldMode
Prototype AttachConsole(dwProcessId)
Procedure ConsoleInit()
Protected LibraryID, AttachConsole
Protected Result = #False
LibraryID = OpenLibrary(#PB_Any, "kernel32.dll")
If LibraryID
AttachConsole.AttachConsole = GetFunction(LibraryID, "AttachConsole")
If AttachConsole
If AttachConsole(-1) ; #ATTACH_PARENT_PROCESS
ConsoleRID = GetStdHandle_(#STD_INPUT_HANDLE)
ConsoleWID = GetStdHandle_(#STD_OUTPUT_HANDLE)
ConsoleOldMode = GetConsoleMode_(ConsoleRID, @ConsoleOldMode)
If ConsoleRID <> #INVALID_HANDLE_VALUE And ConsoleWID <> #INVALID_HANDLE_VALUE
Result = #True
SetConsoleMode_(ConsoleRID, ConsoleOldMode | #ENABLE_PROCESSED_INPUT)
EndIf
EndIf
EndIf
CloseLibrary(LibraryID)
EndIf
ProcedureReturn Result
EndProcedure
Procedure ConsolePrint(Text.s)
Protected nbWritten
WriteConsole_(ConsoleWID, @Text, Len(Text), @nbWritten, #Null)
EndProcedure
Procedure.s ConsoleInput()
Protected *CharacterBuffer, CharactersReaded
Protected Result.s
Beep_(250, 150)
*CharacterBuffer = AllocateMemory(256 * SizeOf(Character))
If *CharacterBuffer
ReadConsole_(ConsoleRID, *CharacterBuffer, 256, @CharactersReaded, #Null)
Result = PeekS(*CharacterBuffer, CharactersReaded)
FreeMemory(*CharacterBuffer)
EndIf
Beep_(500, 150)
ProcedureReturn Result
EndProcedure
Procedure ConsoleExit()
SetConsoleMode_(ConsoleRID, ConsoleOldMode)
FreeConsole_()
EndProcedure
If ConsoleInit() = #True
ConsolePrint("Etwas eingeben: ")
MessageRequester("Eingabe", ConsoleInput())
ConsoleExit()
Else
MessageRequester("", "Console nicht genutzt.")
EndIf
Weiß jemand wo der Fehler liegt bzw. wie ich eine richtig funktionierende Input-Funktion bekomme?