2014-01-22 4 views
3

Я новичок в 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; 
} 
+0

Почему вы хотите использовать GetMessage? В любом случае, вы * можете * использовать его в консольном приложении. – dsi

+0

@dsi Причина, по которой мне нужно использовать GetMessage, сложна, но вы можете больше узнать о моей ситуации [здесь] (http://stackoverflow.com/questions/21139698/how-can-i-recognize-keyboard-input-in -c-with-windows-api-using-getmessage-in), если вы действительно хотите знать. – Cerran

+0

@dsi Я знаю, что могу использовать GetMessage, но я не думаю, что могу использовать его * для ввода ввода с клавиатуры *. На вопрос, связанный с моим предыдущим комментарием, я спросил: «Есть ли у кого-нибудь советы о том, как направить ввод с клавиатуры на систему обмена сообщениями в моем консольном приложении?» На что Ханс Пассант ответил: «Это невозможно. Окно консоли управляется совершенно другим исполняемым файлом, и вы не можете с ним общаться». – Cerran

ответ

1

Когда я создаю приложение Win32 GUI в Code :: Blocks (с использованием MinGW для компиляции) и вызвать AllocConsole в начале , I get error 5: Доступ запрещен.

Объяснение для вызова AllocConsole провала попытки в том, что вы на самом деле построение консоли приложения а. Несмотря на то, что вы используете WinMain, mingw по-прежнему будет производить по умолчанию исполняемый файл, предназначенный для подсистемы консоли. Вы можете использовать такой инструмент, как dumpbin, чтобы проверить заголовок PE, чтобы подтвердить мой вывод.

Скомпилируйте с помощью -mwindows, чтобы убедиться, что исполняемый файл предназначен для подсистемы GUI.

+0

Это похоже на правильность. Спасибо за помощь! Когда я указываю '-mwindows' как опцию компоновщика,' AllocConsole' успешно завершает работу без использования 'FreeConsole', и появляется новая консоль. Мне кажется странным, что это не будет автоматически указано в моем проекте, поскольку я явно создал его как «проект Win32 GUI», а не «консольное приложение» в Code :: Blocks. Я до сих пор не знаю, почему консоль была невидимой, но с '-mwindows', мне не нужно беспокоиться об этом, потому что единственная консоль, созданная явным образом, я создаю явно, что видно по умолчанию. – Cerran

+0

Я попытался использовать dumpbin в своем исполняемом файле, но поскольку я не знаком с этим инструментом, я не был уверен, как найти соответствующую информацию. Но я думаю, что разница в том, что '-mwindows' в основном уже доказала вашу точку зрения. Еще раз спасибо, это было очень полезно. – Cerran

+0

'dumpbin/headers myexe.exe | больше' то, что вам нужно, и ценность интереса - это подсистема. Либо Windows CUI, либо Windows GUI. –

Смежные вопросы