如何屏蔽控制台应用程序的窗口?
来源:互联网 发布:nginx sticky cookie 编辑:程序博客网 时间:2024/05/20 10:14
众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种方法。
操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在VC下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。
具体设置哪个入口点是由连接器的“/subsystem:”选项参数确定的,它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式:“CONSOLE|WINDOWS|NATIVE|POSIX”如果这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台,有关连接器参数选项的详细说明请参考 MSDN 库。
下面我们将通过预编译指令来对编译器和连接器进行设置,从而达到我们的目的:例子代码运行后播放Windows系统启动声音三次,然后退出,运行后不会显示控制台窗口。
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib") // 告诉连接器与这个库连接,因为我们要播放多媒体声音
#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置连接器选项
int main(void)
{
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
return 0;
}
在 IDE 环境中新建一个空的控制台程序,将上述代码添加到工程中,编译运行。
最新评论 [发表评论] 查看所有评论 推荐给好友 打印
同意 Kelvin_UV 的話, 何必搞這麼麻煩, 如果只是為了說明你有多麼強, 我... ... ... ( GXHETAO 发表于 2004-9-15 12:27:00)
上面我的说法有点错误,在MFC程序中,应该是0x144。 ( meteor135 发表于 2004-9-13 17:35:00)
楼上的方法果然没错,我把一个没有DOS窗口的程序,比如MFC编写的窗口程序用UltraEdit打开,然后把0x133~0x134的02改成03,然后保存,重新打开这个程序居然出现了黑窗口!为什么这个秘密之前没有人公开过呢? ( meteor135 发表于 2004-9-13 17:33:00)
我有方法可以将一个原有的 DOS 程序变为看不见
先用 16 位编辑工具开了那个执行档
在位置 0x130~0x13f (通常是 0x13c 或 0x134) 的位置之间找个数值 03,将它变为02
原来就是这么简单喔 !! ( s000792003 发表于 2004-9-13 16:55:00)
综合方案(没多少实用价值):
#define ENTRY_SCHEME 1 //控制使用何种方案的宏常量
#if ENTRY_SCHEME==1
#pragma message("------------main---------------")
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main( void )
#else
#pragma message("-----------WinMain-------------" )
#pragma comment( linker, "/subsystem:windows" )
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
#endif
{
}
( meteor135 发表于 2004-9-13 13:41:00)
为了不显示Console Window,必须使用/subsystem: windows Linker Option,
但是一旦使用了它,
如果不指定/entry:<function> Linker Option,Linker将查找WinMain作为entry point.
此时只要为程序提供WinMain入口函数即可。
如果不用WinMain而用main,就必须为Linker指定/entry:mainCRTStartup
由此可见,具体方案有两个:
方案1:
#pragma comment( linker, "/subsystem:windows" )
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
}
方案2:
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main(void)
{
}
( meteor135 发表于 2004-9-13 13:39:00)
请问这样做,连接器如何设置?按照缺省设置link通不过。 ( hangwire 发表于 2004-9-11 23:53:00)
不明白!, 这样做不是更简单吗?
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
return 0;
}
( Kelvin_UV 发表于 2004-9-11 23:23:00)
有时需要用控制台程序做一些没有用户交互的后台批量处理,不想显示命令行窗口。 ( hangwire 发表于 2004-9-11 22:35:00)
为什么不直接用Win32 Application呢, 既然控制台程序不要命令行窗口, 又为什么用控制台程序呢? ( Kelvin_UV 发表于 2004-9-11 21:28:00)
操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点实际上是由连接程序设置的,不同的连接器选择的入口函数也不尽相同。在VC下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用你自己编写的 main 函数;对图形用户界面(GUI)程序设置的入口函数是 WinMainCRTStartup,WinMainCRTStartup 调用你自己写的 WinMain 函数。
具体设置哪个入口点是由连接器的“/subsystem:”选项参数确定的,它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式:“CONSOLE|WINDOWS|NATIVE|POSIX”如果这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台,有关连接器参数选项的详细说明请参考 MSDN 库。
下面我们将通过预编译指令来对编译器和连接器进行设置,从而达到我们的目的:例子代码运行后播放Windows系统启动声音三次,然后退出,运行后不会显示控制台窗口。
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib") // 告诉连接器与这个库连接,因为我们要播放多媒体声音
#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置连接器选项
int main(void)
{
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
return 0;
}
在 IDE 环境中新建一个空的控制台程序,将上述代码添加到工程中,编译运行。
最新评论 [发表评论] 查看所有评论 推荐给好友 打印
同意 Kelvin_UV 的話, 何必搞這麼麻煩, 如果只是為了說明你有多麼強, 我... ... ... ( GXHETAO 发表于 2004-9-15 12:27:00)
上面我的说法有点错误,在MFC程序中,应该是0x144。 ( meteor135 发表于 2004-9-13 17:35:00)
楼上的方法果然没错,我把一个没有DOS窗口的程序,比如MFC编写的窗口程序用UltraEdit打开,然后把0x133~0x134的02改成03,然后保存,重新打开这个程序居然出现了黑窗口!为什么这个秘密之前没有人公开过呢? ( meteor135 发表于 2004-9-13 17:33:00)
我有方法可以将一个原有的 DOS 程序变为看不见
先用 16 位编辑工具开了那个执行档
在位置 0x130~0x13f (通常是 0x13c 或 0x134) 的位置之间找个数值 03,将它变为02
原来就是这么简单喔 !! ( s000792003 发表于 2004-9-13 16:55:00)
综合方案(没多少实用价值):
#define ENTRY_SCHEME 1 //控制使用何种方案的宏常量
#if ENTRY_SCHEME==1
#pragma message("------------main---------------")
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main( void )
#else
#pragma message("-----------WinMain-------------" )
#pragma comment( linker, "/subsystem:windows" )
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
#endif
{
}
( meteor135 发表于 2004-9-13 13:41:00)
为了不显示Console Window,必须使用/subsystem: windows Linker Option,
但是一旦使用了它,
如果不指定/entry:<function> Linker Option,Linker将查找WinMain作为entry point.
此时只要为程序提供WinMain入口函数即可。
如果不用WinMain而用main,就必须为Linker指定/entry:mainCRTStartup
由此可见,具体方案有两个:
方案1:
#pragma comment( linker, "/subsystem:windows" )
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
}
方案2:
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main(void)
{
}
( meteor135 发表于 2004-9-13 13:39:00)
请问这样做,连接器如何设置?按照缺省设置link通不过。 ( hangwire 发表于 2004-9-11 23:53:00)
不明白!, 这样做不是更简单吗?
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
PlaySound("SystemStart",NULL, SND_ALIAS|SND_SYNC);
Sleep(50);
return 0;
}
( Kelvin_UV 发表于 2004-9-11 23:23:00)
有时需要用控制台程序做一些没有用户交互的后台批量处理,不想显示命令行窗口。 ( hangwire 发表于 2004-9-11 22:35:00)
为什么不直接用Win32 Application呢, 既然控制台程序不要命令行窗口, 又为什么用控制台程序呢? ( Kelvin_UV 发表于 2004-9-11 21:28:00)
- 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口?
- mainCRTStartup 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口?
- 如何屏蔽控制台应用程序的窗口(虚拟DOS窗口)
- 屏蔽控制台应用程序的窗口
- 屏蔽控制台应用程序的窗口
- 屏蔽控制台应用程序的窗口
- 屏蔽控制台应用程序的窗口
- 屏蔽控制台应用程序窗口
- 屏蔽控制台应用程序窗口
- 屏蔽控制台应用程序窗口,悄然杀死QQ
- 如何去掉控制台应用程序的窗口
- 如何隐藏win32控制台应用程序的窗口
- 屏蔽控制台应用程序的窗口 #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
- AOP
- 开源软件七大盈利模式
- MySQL修改密码方法总结
- 触发器介绍
- 便利的开发工具-log4cpp快速使用指南
- 如何屏蔽控制台应用程序的窗口?
- ASP.NET2.0中Gridview中数据操作技巧
- [系列1]IIS7 Module Overview
- 现实,奋斗,踏实。
- 生成n位不同的验证码
- 看了一遍ActionSoft BPM platform的Online Demo
- 解决mysql远程连接问题
- 在ASP.NET中显示进度条
- ASP.NET上传图片时,产生预览