user-0 提问: 创建控制台后，无法输出到控制台是怎么回事？

回复:
user: user-1
content: 当然，恰恰相反，我比你老师牛多了！

user: user-0
content: 引用 8 楼 Intel0011 的回复:FreeConsole(); 相当于将输入输出流与"显示屏"脱离了，输入输出流虽然有数据显示，但却无"显示屏"，当然显示不了 AllocConsole();相当于创建了一个"显示屏"，但却无数据流与之相连，故无法显示 只有将输入输出流与"显示屏"相连才能正常显示，重定向相当于将两者相连 至于IDE上编译运行的时候没有这问题，我猜是IDE帮你做连接工作 我对界面不是很熟悉，有很多问题也没弄清楚，没时间折腾，你折腾清楚了记得告诉我 回答你的问题可不容易，但你的问题还是很有质量的，一般人问不了，估计你老师也很难回答你 当然我比你老师菜多了 大佬您可别这么说，你是很厉害的，至少是我觉得来CSDN以来遇到的最给力的朋友了，每次都简洁明了直指核心，可谓一针见血，让我豁然开朗，一直以来都非常感谢您的帮助。我没有老师，是在自学瞎琢磨，感谢有你！

user: user-2
content: 你忘了一件事--输出重定向 小改了一下你的程序，可以看到输出  #include <windows.h> #include <stdio.h>  #pragma comment(lib, "user32") #pragma comment(lib, "gdi32")  LRESULT WINAPI MyProc(HWND h , UINT msg , WPARAM wParam , LPARAM lParam) {    static int i = 0;     switch (msg)    {    case WM_TIMER:                    //每隔1秒尝试向控制台输出       //MessageBox(h , "A" , "B", 0);        printf("%d ", ++i);       return 0;     /*    case WM_MBUTTONDOWN:       {          HWND h = GetConsoleWindow();          if(h == NULL)             MessageBox(h , "A" , "A", 0);           else             MessageBox(h , "B" , "B", 0);           return 0;       }    //*/        case WM_LBUTTONDOWN:            //单击左键新建控制台        AllocConsole();       freopen("CONIN$",  "r+t", stdin);  // 重定向输入       freopen("CONOUT$", "w+t", stdout); // 重定向输出       freopen("CONOUT$", "w+t", stderr); // 重定向错误输出       SetTimer(h, 1, 1000, NULL);       i = 0;       //AttachConsole(GetCurrentProcessId);       //printf("ABCDE");       return 0;     case WM_RBUTTONDOWN:            //单击右键脱离控制台        fclose(stderr);          fclose(stdout);          fclose(stdin);       KillTimer(h, 1);       FreeConsole();        return 0;     case WM_DESTROY:            PostQuitMessage(0);       return 0;    }    return DefWindowProc(h , msg , wParam , lParam); }  void SetWNDCLASS(WNDCLASS *a, WNDPROC proc, LPCTSTR ClassName) {    a->style         = CS_HREDRAW | CS_VREDRAW;            a->lpfnWndProc   = proc;                                a->cbClsExtra    = 0;            a->cbWndExtra    = 0;        a->hInstance     = GetModuleHandle(NULL);    a->hIcon         = NULL;                a->hCursor       = NULL;    a->hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);        a->lpszMenuName  = NULL;        a->lpszClassName = ClassName;     }   ATOM RegMyClass(const char *name , WNDPROC proc) {    WNDCLASS MyClass;    SetWNDCLASS(&MyClass, proc, name);        return RegisterClass(&MyClass); }  int main(void) {    FreeConsole();                        //在一开始就去掉控制台     RegMyClass("MYCLASS", MyProc);    CreateWindow("MYCLASS", "控制台测试", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 400, 400, 300, 300, NULL, NULL, NULL, NULL);    MSG msg;    while (GetMessage(&msg, NULL, 0, 0))     {       DispatchMessage(&msg);    }    return 0; }

user: user-3
content: 没看你定义的实现，但是CreateWindow 创建完返回的句柄，然后传递给GetMessage 作为参数应该是最基本的操作，否则你message从NULL里面能获取到啥？

user: user-3
content: 你创建的窗口，句柄都不要了么？

user: user-2
content: 引用 7 楼 六道佩恩 的回复:请问为什么需要这个重定向，但IDE上编译运行的时候没有这问题的呀 FreeConsole(); 相当于将输入输出流与"显示屏"脱离了，输入输出流虽然有数据显示，但却无"显示屏"，当然显示不了 AllocConsole();相当于创建了一个"显示屏"，但却无数据流与之相连，故无法显示 只有将输入输出流与"显示屏"相连才能正常显示，重定向相当于将两者相连 至于IDE上编译运行的时候没有这问题，我猜是IDE帮你做连接工作 我对界面不是很熟悉，有很多问题也没弄清楚，没时间折腾，你折腾清楚了记得告诉我 回答你的问题可不容易，但你的问题还是很有质量的，一般人问不了，估计你老师也很难回答你 当然我比你老师菜多了

user: user-0
content: 引用 3 楼 Intel0011 的回复:你忘了一件事--输出重定向 小改了一下你的程序，可以看到输出 请问为什么需要这个重定向，但IDE上编译运行的时候没有这问题的呀

user: user-0
content: 引用 1 楼 英雄@末路 的回复:你创建的窗口，句柄都不要了么？ 对，不需要，用不着

user: user-0
content: 引用 2 楼 英雄@末路 的回复:没看你定义的实现，但是CreateWindow 创建完返回的句柄，然后传递给GetMessage 作为参数应该是最基本的操作，否则你message从NULL里面能获取到啥？ NULL可以让GetMessage获取当前线程创建的所有窗口的消息

user: user-1
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309