繁体   English   中英

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

[英]Can I use the default console in a Win32 GUI application, or should I create a new one?

我是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;
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM