我是Windows API的新手,我正在用C ++编程。我想有一个控制台,通过GetMessage输出信息并接收键盘命令。但是,我不能只创建一个控制台应用程序,因为如果我这样做,则无法读取使用GetMessage
发送到该控制台的键盘消息。 通过GetMessage对键盘输入做出反应是此项目的必要条件。
当我在Code :: Blocks 13.12中创建Win32 GUI应用程序(使用MinGW进行编译)并在开头调用AllocConsole
时,我收到错误5:“访问被拒绝”。如果我首先使用FreeConsole
,FreeConsole
会成功而不会出错;如果我然后使用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;
}
答案 0 :(得分:1)
当我在Code :: Blocks中创建Win32 GUI应用程序(使用MinGW编译)并在开头调用
AllocConsole
时,我收到错误5:访问被拒绝。
您对AllocConsole
的调用失败的原因是您实际上正在构建控制台应用程序。即使您使用WinMain
,默认情况下,mingw仍会生成一个以控制台子系统为目标的可执行文件。您可以使用dumpbin
之类的工具来检查PE标头以确认我的结论。
使用-mwindows
进行编译,以确保可执行文件以GUI子系统为目标。