我可以在Win32 GUI应用程序中使用默认控制台,还是应该创建一个新控制台?

时间:2014-01-22 14:48:49

标签: c++ winapi console

我是Windows API的新手,我正在用C ++编程。我想有一个控制台,通过GetMessage输出信息并接收键盘命令。但是,我不能只创建一个控制台应用程序,因为如果我这样做,则无法读取使用GetMessage发送到该控制台的键盘消息。 通过GetMessage对键盘输入做出反应是此项目的必要条件。

当我在Code :: Blocks 13.12中创建Win32 GUI应用程序(使用MinGW进行编译)并在开头调用AllocConsole时,我收到错误5:“访问被拒绝”。如果我首先使用FreeConsoleFreeConsole会成功而不会出错;如果我然后使用AllocConsole,则会出现一个控制台窗口。 FreeConsole的MSDN说明是:

  

从其控制台中分离调用进程。

这表明在我调用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;
}

1 个答案:

答案 0 :(得分:1)

  

当我在Code :: Blocks中创建Win32 GUI应用程序(使用MinGW编译)并在开头调用AllocConsole时,我收到错误5:访问被拒绝

您对AllocConsole的调用失败的原因是您实际上正在构建控制台应用程序。即使您使用WinMain,默认情况下,mingw仍会生成一个以控制台子系统为目标的可执行文件。您可以使用dumpbin之类的工具来检查PE标头以确认我的结论。

使用-mwindows进行编译,以确保可执行文件以GUI子系统为目标。