调试时在Dos窗口里打印内容
调试时在Dos窗口里打印内容
#include<cstdio>
#include <windows.h>
#include<cstring>
HANDLE g_hOutput = 0; // 标准输出句柄
// 窗口处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{
switch (msgID)
{
case WM_DESTROY:
char szText[256] = "Destory";
WriteConsole(g_hOutput, szText, strlen(szText), NULL, NULL);
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msgID, wParam, lParam);
}
// 入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{
AllocConsole(); // 增加Dos
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
// 新建窗口类
WNDCLASS wc = { 0 };
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wc.hCursor = NULL;// 默认光标
wc.hIcon = NULL;// 默认图标
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Windows";
wc.lpszMenuName = NULL; // 无菜单
wc.style = CS_HREDRAW | CS_VREDRAW;
// 注册窗口类
RegisterClass(&wc);
// 内存中创建窗口
HWND hWind = CreateWindow("Windows", "windows", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, NULL, NULL);
// 显示窗口
ShowWindow(hWind, SW_SHOW);
UpdateWindow(hWind);
// 消息循环
MSG nMsg = { 0 };
while (true)
{
if (PeekMessage(&nMsg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&nMsg, NULL, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
else break;
}
else
{
// 空闲处理
}
}
/*while (GetMessage(&nMsg, NULL, 0, 0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}*/
UnregisterClass("Windows", hIns);
return 0;
}
值得注意的就这么几行:
1全局变量声明标准输出句柄
HANDLE g_hOutput = 0; // 标准输出句柄
微软定义三个标准设备的句柄(标准输入、标准输出或标准错误),这就是其中之一。
2增加Dos和获得标准输出句柄
AllocConsole(); // 增加Dos
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
GetStdHandle 函数用于检索指定标准设备的句柄。
3消息处理时输出
case WM_DESTROY:
char szText[256] = "Destory";
WriteConsole(g_hOutput, szText, strlen(szText), NULL, NULL);
PostQuitMessage(0);
break;
WriteConsole输出中文更兼容。

浙公网安备 33010602011771号