Seite 1 von 1

Konsole: Input reagiert erst beim zweiten mal ?

Verfasst: 13.04.2010 17:42
von c4s
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:

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
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?