Я новичок в Windows API и программирую на C++. Я хотел бы иметь консоль для вывода информации и приема команд клавиатуры через GetMessage. Однако я не могу просто создать консольное приложение, потому что если я это сделаю, невозможно прочитать сообщения клавиатуры, отправленные на эту консоль, с GetMessage
. Реагирование на ввод с клавиатуры через GetMessage является требованием для этого проекта.Могу ли я использовать консоль по умолчанию в приложении Win32 GUI, или мне нужно создать новую?
Когда я создаю приложение Win32 GUI в Code :: Blocks 13.12 (используя MinGW для компиляции) и вызываю AllocConsole
в начале, я получаю сообщение об ошибке 5: «Access denied». Если я вместо этого сначала использую FreeConsole
, FreeConsole
удастся без ошибок; если я затем использую AllocConsole
, появится окно консоли. Описание MSDN FreeConsole
:
Отключает вызывающий процесс со своей консоли.
Это указывает на то, что до того, как я позвонил в FreeConsole, консоль уже существовала (хотя я не мог ее увидеть и явно не создал). Это невидимая консоль или она всегда появляется при запуске проекта Code :: Blocks? Для меня бессмысленно использовать FreeConsole
, а затем AllocConsole
? Есть ли способ сделать консоль уже существующей видимой (если она невидимая) и способна принимать ввод с клавиатуры через GetMessage
?
Вот пример кода урезанной, который проявляет такое поведение:
#include <windows.h>
DWORD dw = 0;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
if (FreeConsole() == 0) {
dw = GetLastError();
return dw;
}
if (AllocConsole() == 0) {
dw = GetLastError();
return dw;
}
return 1;
}
Почему вы хотите использовать GetMessage? В любом случае, вы * можете * использовать его в консольном приложении. – dsi
@dsi Причина, по которой мне нужно использовать GetMessage, сложна, но вы можете больше узнать о моей ситуации [здесь] (http://stackoverflow.com/questions/21139698/how-can-i-recognize-keyboard-input-in -c-with-windows-api-using-getmessage-in), если вы действительно хотите знать. – Cerran
@dsi Я знаю, что могу использовать GetMessage, но я не думаю, что могу использовать его * для ввода ввода с клавиатуры *. На вопрос, связанный с моим предыдущим комментарием, я спросил: «Есть ли у кого-нибудь советы о том, как направить ввод с клавиатуры на систему обмена сообщениями в моем консольном приложении?» На что Ханс Пассант ответил: «Это невозможно. Окно консоли управляется совершенно другим исполняемым файлом, и вы не можете с ним общаться». – Cerran