调试时在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输出中文更兼容。

posted @ 2022-08-15 12:21  DarkLights  阅读(9)  评论(0)    收藏  举报