我们知道,控制台应用程序本身是没有窗口的。系统为了让我们能看到程序执行的结果,会在程序执行时借一个命令提示符窗口(CMD 窗口)。所以,就有了这个黑黑的窗口…

命令提示符窗口

有时候我们又不想让这个窗口显示出来,那么我们该怎么做呢?

我总结了以下几种方法:

一、方法一

在头文件的后面加上一行代码:

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )

原理解释:
一、subsystem 和可执行文件的启动
LINK 的时候需要指定 /subsystem,这个链接选项告诉 Windows 如何运行可执行文件。
我们知道用 VC 编写的程序,运行的时候是需要 C/C++ 运行库支持的。
当我们运行一个 C/C++ 程序的时候,链接器会首先寻找应用程序的启动函数,例如:
如果你建立了一个 console 程序的话,编译器得链接开关会是以下这种形式:

1
2
/subsystem:"console" /entry:"mainCRTStartup" (ANSI)
/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

将 subsystem 选成”console”后,Windows在进入可执行文件的代码前(如mainCRTStartup),就会产生一个控制台窗口。之后mainCRTStartup 或 wmainCRTStartuup 会调用main或wmain。
如果你建立了一个win32 application,编译器得链接开关则会是一下形式

1
2
/subsystem:"windows" /entry:"WinMainCRTStartup" (ANSI)
/sbusystem:"windows" /entry:"wWinMainCRTStartup" (UINCODE)

将 subsystem 选成”console”后,操作系统就不产生console窗口,该类型应用程序的窗口由用户自己创建。WinMainCRTStartup 或 wWinMainCRTStartup 会调用 WinMain 或 wWinMain。
值得一提的是,在进入应用程序的Entry Point前,Windows的装载器已经做过C变量的初始化,有初值的全局变量拥有了它们的初值,没有初值的变量被设为0。

二、方法二

利用 VBS 脚本启动程序:

1
2
3
4
5
set objShell=wscript.createObject("wscript.shell")
iReturn=objShell.Run("你的程序.exe", 0, FALSE) 'Run()
'第一个参数是你要执行的程序的路径,
'第二个参数是窗口的形式,0后台运行;1正常运行;2最小化;3最大化;缺省的话表示正常运行
'第三个参数是表示这个脚本是等待还是继续执行,如果设为了True,脚本就会等待调用的程序退出后再向后执行。

三、方法三

通过其他程序来调用需要隐藏窗口的程序(完全隐藏):
WinExec("需要隐藏窗口的程序",SW_HIDE); //隐藏执行其他程序