c++ - 在主 win32 窗口中创建窗口控制台

标签 c++ winapi console

我有一个 win32 应用程序,需要在按下波浪号时像游戏一样打开控制台。我认为最好的解决方案是使用 CreateWindow 函数。这是正确的吗?我怎样才能让它与主窗口重叠并在再次按下波浪号时隐藏它?谢谢大家

最佳答案

此处的解决方案将不起作用,因为较新版本的 Windows SDK 通过以下方式定义 FILE 结构:

#ifndef _FILE_DEFINED
    #define _FILE_DEFINED
    typedef struct _iobuf
    {
        void* _Placeholder;
    } FILE;
#endif

当试图用 = 运算符覆盖 stdin/out FILE 结构时,只会复制一个指针。要复制整个 FILE 结构,您必须在 windows.h 包含之前定义 FILE 结构:

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

#include <Windows.h>

如果这对您来说不可能,您仍然可以将自己的 FILE 结构定义为 FILE_COMPLETE 并使用此代码片段:

#include <Windows.h>
#include <io.h>
#include <fcntl.h>

AllocConsole();
SetConsoleTitleA("ConsoleTitle");
typedef struct { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE_COMPLETE;
*(FILE_COMPLETE*)stdout = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT), "w");
*(FILE_COMPLETE*)stderr = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w");
*(FILE_COMPLETE*)stdin = *(FILE_COMPLETE*)_fdopen(_open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r");
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
setvbuf(stdin, NULL, _IONBF, 0);

关于c++ - 在主 win32 窗口中创建窗口控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068392/

相关文章:

C++程序计算出我的电脑有多少内存?

c++ - Microsoft 中的 C++ 标准库文件流操作是否已瘫痪?

c++ - InitCommonControlsEx() 在 Windows 8.1 中因 ICC_LINK_CLASS 而失败

c - MDI子窗口和状态栏C win32 API

javascript - 在控制台中使用新脚本重新加载页面

c++ - 我的类包含 1 个枚举、2 个整数和一个指针。它没有虚函数,但有 20 个字节。为什么?

c++ - 是否可以创建一个位集 vector ?

c++ - 无法在实时linux中更改循环时间量

api - 是否可以从控制台查询 Whisper (Graphite DB) 的数据?

ios - 呈现 viewController 时控制台警告