gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:04:52 28 4
gpt4 key购买 nike

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

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

Detaches the calling process from its console.

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

最佳答案

When I create Win32 GUI application in Code::Blocks (using MinGW to compile) and call AllocConsole at the beginning, I get error 5: Access is denied.

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

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

关于c++ - 我可以在 Win32 GUI 应用程序中使用默认控制台,还是应该创建一个新控制台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21286108/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com