我刚接触Windows API编程,用的是C++语言。我想要创建一个控制台,用于输出信息和通过GetMessage接收键盘命令。但是,如果我创建一个控制台应用程序,就无法使用GetMessage读取发送到该控制台的键盘消息。在这个项目中,通过GetMessage响应键盘输入是必需的。
当我在Code::Blocks 13.12中创建Win32 GUI应用程序(使用MinGW进行编译)并在开头调用AllocConsole时,我会得到错误5:“拒绝访问”。如果我先使用FreeConsole,那么FreeConsole将成功执行且没有错误;如果我接着使用AllocConsole,则会出现一个控制台窗口。MSDN对FreeConsole的描述如下:
“从其控制台中分离调用进程。”
这表明,在调用FreeConsole之前,已经存在一个控制台(即使我看不见它,也没有显式地创建它)。它是一个不可见的控制台,还是每次运行Code::Blocks项目时都会出现的控制台?使用FreeConsole然后AllocConsole是否毫无意义?是否有一种方法可以使已经存在的控制台可见(如果它是不可见的),并能够通过GetMessage接收键盘输入?
下面是一个展示此行为的简化代码示例:
当我在Code::Blocks 13.12中创建Win32 GUI应用程序(使用MinGW进行编译)并在开头调用AllocConsole时,我会得到错误5:“拒绝访问”。如果我先使用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;
}
AllocConsole
在没有先调用FreeConsole
的情况下成功了吗? - Cerran