Почему бы не заставить поток графического интерфейса работать в другом потоке и оставить консольный ввод в основном потоке. Вы можете помещать события в поток GUI после чтения из командной строки. На мой взгляд, все гораздо проще.
Это работает, конечно, если ваш графический интерфейс позволяет вам запускать его в другом потоке, чем основной.
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Не могли бы вы просто создать текстовый элемент управления / окно и получить оттуда ввод? Когда вы нажимаете Enter, он очищает ввод - как печатать сообщения на консоли? Я полагаю, что в GUI все гораздо проще