在控制台程序中隐藏控制台窗口!

原创 2004年12月14日 14:00:00

大家都知道,当编写一个win32 console application时,当运行此类程序的时候
默认情况下会有一个类似DOS窗口的console窗口,但是有的时候我们只想在程序
中运行一段功能代码,不希望显示这个console窗口,让代码执行完毕之后程序自
动退出.

下面就介绍一下,如何隐藏win32 console application的console窗口

因为此种方法是通过设置编译器的链接开关来实现,所以让我们来看一下编译
器的链接开关选项(也就是linker选项).

首先我们来看一下linker的 /subsystem 选项

该选项的语法形式如下:
/SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|
            EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}
            [,major[.minor]]

这个链接选项告诉操作系统如何运行可执行文件

CONSOLE:
win32 字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS
窗口的控制台窗口,如果在应用程序的主函数为main()或者wmain(),在默认情况下
该应用程序就是一个控制台应用程序

Extensible Firmware Interface
和CPU具体架构相关的一个参数选项,并不常用,在这里暂不详细介绍.
如果对此有兴趣的可以访问intel主页来查看相关内容

NATIVE;
设备驱动器选项,如果/DRIVER:WDM选项被设定的话,该链接选项(NATIVE)就为默认选项

POSIX:
在windows NT 种运行在POSIX子系统上的应用程序

WINDOWS:
该类型的应用程序不产生console窗口,该类型的应用程序的窗口由用户自己创建,简而言之
就是一个标准的Win32 application,其入口地址为WinMain()函数或者wWinMain()函数的地址
如果你在应用程序种定义的主函数为WinMain或者wWinMain,在默认情况下该应用程序就是一个
Win32 Application !

WINDOWSCE:
运行在windows CE上的应用程序

major and minor (optional):
主版本号和次版本号,该选项为可选,该选项为0~65535之间的十进制整数

从上面可以看出如果我们建立一个win32 console application的话,linker的/subsystem选项应该为
CONSOLE,可以在VC开发环境的project->setting->link->project option中看到!

接下来我们再看看应用程序是如何运行的!
我们知道用VC编写的程序,运行的时候是需要 C/C++运行库支持的.当我们运行一个C/C++程序的时候
链接器会首先寻找应用程序的启动函数,例如:
如果你建立了一个console程序的话,编译器得链接开关会是以下这种形式
/subsystem:"console" /entry:"mainCRTStartup"   (ANSI)
/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

如果你建立了一个win32 application,编译器得链接开关则会是一下形式
/subsystem:"windows" /entry:"WinMain"   (ANSI)
/sbusystem:"windows" /entry:"wWinMain"  (UINCODE)

上面的两种形式可以再project->setting->link->project option中看到
上面的subsystem和entry并不需要都设置,如果你只设置了/subsystem:"console"
的话,那么默认的entry开关在默认情况下应为/entry:"mainCRTStartup"
反之,如果你在应用程序中定义了main函数的话,默认情况下,你的/subsystem开关
应该为/system:"console"


在默认情况下/subsystem 和/entry开关是匹配的,也就是
console对应mainCRTStartup或者wmainCRTStartup
windows对应WinMain或者wWinMain

但是我们也可以通过手动改动的方式使他们不匹配


例如我们可以这样改动

#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置入口地址


int main(int argc, char* argv[])
{
 MessageBox(NULL, "hello", "Notice", MB_OK);
 return 0;
}

在默认情况下链接器看到/subsystem下是windows选项的时候,它会自动寻找WinMain或者wWinMain

但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!


上面是在代码中使用#pragma指令来设置,还有一种就是直接在开发环境的
project->setting->link->project option中手工改动!

写了这么多,自己都有点感觉乱,没有办法,以前没写过什么文章,所以措辞可能不太好,希望大家见谅

C\C++控制台程序隐藏方法总结

学习编程
  • lynch0571
  • lynch0571
  • 2014年06月22日 14:29
  • 6704

随笔5 - C#控制台窗口的显示与隐藏

1. 定义一个Consolse帮助类,如下: /// /// 控制台帮助类 /// public static class ConsoleHelper ...
  • lxfmq0
  • lxfmq0
  • 2012年10月22日 14:59
  • 8024

[VC++]控制台程序窗口隐藏

HWND   hWnd;     SetConsoleTITle("HEHE");     hWnd=::FindWindow(NULL,"HEHE");     ShowWi...
  • likeping
  • likeping
  • 2015年07月24日 18:23
  • 2052

VS2010隐藏控制台程序的黑框

原文地址:http://m.jb51.net/article/35431.htm 觉得原文有点长,所以自己弄简洁一点,方便以后查看~ 1.如果console程序已经写好了,不能改了,也可以。写一个...
  • lijia11080117
  • lijia11080117
  • 2015年04月07日 10:08
  • 2879

C\C++控制台程序隐藏方法总结

学习计算机,往往先从Windows环境下学习编程,学习编程,往往从C学起,学习C,往往又从控制台程序学习,何为控制台,就是那个黑框白字的界面。对于这样一个最初认为奇陋无比而现在认为无所不能的编程平台,...
  • qq1841370452
  • qq1841370452
  • 2016年11月18日 11:50
  • 1252

如何隐藏win32 控制台程序的console窗口

如下设置 #pragma   comment(   linker,   "/subsystem:/ "windows/ "   /entry:/ "mainCRTStartup/ " "   )   ...
  • Amy_1007
  • Amy_1007
  • 2010年08月27日 18:10
  • 4969

隐藏控制台应用程序的窗口

原址:http://www.cnblogs.com/kex1n/archive/2011/04/10/2011254.html 众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),...
  • pony12
  • pony12
  • 2016年08月26日 16:38
  • 965

Win32控制台应用程序隐藏弹出的那个DOS窗口

调用FreeConsole(); 需要头文件windows.h,在程序开始时调用就行了。但是VC开发环境的控制台还是会有的,因为那是VC调的,不过你的程序不会输出到那个控制台罢了 projec...
  • u011334621
  • u011334621
  • 2014年11月20日 14:48
  • 1635

如何隐藏控制台窗口?

如何隐藏控制台窗口?设置#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置入口地址 ...
  • fengzi_shen
  • fengzi_shen
  • 2007年11月16日 10:09
  • 2359

[VC++]控制台程序窗口隐藏

HWND   hWnd;     SetConsoleTITle("HEHE");     hWnd=::FindWindow(NULL,"HEHE");     ShowWind...
  • wawj522527
  • wawj522527
  • 2012年09月05日 16:30
  • 8304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在控制台程序中隐藏控制台窗口!
举报原因:
原因补充:

(最多只允许输入30个字)