调用 AllocConsole()
函数可以创建一个新的控制台窗口,而 FreeConsole()
函数则用于释放该控制台窗口的资源。
但是,在实际使用时,FreeConsole()
函数并不一定会关闭控制台窗口。
这是因为控制台窗口可能被其他进程或线程共享。如果当前进程拥有的控制台窗口正在被其他进程或线程使用,那么调用 FreeConsole()
函数并不会关闭该窗口。
相反,它只会将当前进程与控制台窗口的关联解除,使其他进程或线程可以继续使用该窗口。
如果要彻底关闭控制台窗口,需要保证它没有被其他进程或线程使用,并调用如下代码:
FreeConsole(); PostMessage(GetConsoleWindow(), WM_QUIT, 0, 0);
WM_CLOSE / WM_QUIT / WM_DESTROY
这三个消息都是 Windows 消息,用于操作控件或窗口。
它们的作用如下:
WM_CLOSE
当用户单击窗口的关闭按钮时,Windows 发送 WM_CLOSE
消息给该窗口。
如果窗口处理了这个消息,说明窗口已经准备好关闭,并且可以调用 DestroyWindow()
函数来销毁该窗口。
当收到WM_CLOSE消息,你可以做两件事儿。一件是你接受默认的处理并返回一个值,你若这样做了,应用程序或窗口按照计划关闭,或者返回0,应用程序或窗口将保持原样。
WM_QUIT
当调用 PostQuitMessage()
函数时,将发送 WM_QUIT
消息到该线程的消息队列中。
Windows 会在此消息被处理后从该线程的消息循环中退出,因此 WM_QUIT
通常用于正常地退出 GUI 程序。
当一个用户关闭了主窗口,并希望这意味着是要结束应用程序时,如果你希望真的这么做,那么在收到WM_DESTROY消息的时候,你必须发出一个WM_QUIT消息。
WM_QUIT是应用程序结束发出的消息,一般可以看成进程被kill掉的情况。
WM_DESTROY
当一个窗口被销毁时,Windows 发送 WM_DESTROY
消息给该窗口。
如果处理了这个消息,说明窗口已经被销毁,并且可以做一些清理工作。
当收到WM_DESTROY消息的时候,窗口已经从视觉上被删除,但一个主窗口被关闭,并不意味着应用程序结束了,因为它可以在没有窗口的条件下继续运行。