隐藏控制台(console)窗口

本文介绍如何通过设置编译器选项/subsytem和/entry来隐藏应用程序的控制台窗口,适用于不希望显示控制台的Windows应用程序。

隐藏控制台(console)窗口

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

Note:
/subsytem:告诉操作系统如何运行编译生成的.exe文件,有CONSOLE|WINDOWS|NATIVE|POSIX着四种选择,如果这个选项参数的值为 WINDOWS,则表示该应用程序运行时不需要控制台。(忽略大小写)
/entry:设置入口地址 你编写的是main函数就是mainCRTStartup 编写的是WinMain函数就是WinMainCRTStartup

C++中,如果你正在编写一个Windows应用程序,并希望隐藏控制台窗口,则需要通过WinAPI来实现这一功能。通常来说,默认创建的C++项目可能会附带一个控制台窗口(特别是基于控制台的应用程序),但我们可以通过一些方法将其隐藏。 以下是几种常见的做法: ### 方法一:使用 `FreeConsole()` 函数 `FreeConsole()` 是 Windows API 提供的一个函数,用于分离当前进程与它所关联的控制台。如果成功,该函数会关闭现有的控制台窗口。 ```cpp #include <windows.h> int main() { FreeConsole(); // 调用此函数可以释放控制台 // 其他代码... return 0; } ``` 注意:当调用了 `FreeConsole()` 后,所有后续尝试向控制台打印的内容都将无效,因为控制台已被销毁。 --- ### 方法二:修改链接选项 (推荐) 对于不需要显示控制台窗口的应用程序,例如 GUI 程序,在编译时可以选择将生成的目标文件类型更改为 "Windows 应用" 模式而不是默认的 "控制台应用"。 #### 在 Visual Studio 中的操作步骤: 1. 打开项目的属性页 (`Alt + F7`); 2. 导航到 **配置属性 -> 链接器(Linker) -> 系统(System)**; 3. 将“子系统(SubSystem)”从 `/SUBSYSTEM:CONSOLE` 更改为 `/SUBSYSTEM:WINDOWS`。 完成上述设置之后,运行出来的程序就不会自动弹出命令行界面了! > 温馨提示:如果您仍然想保留标准输入输出流的功能又不想让黑屏一闪而过的话,可以在合适的位置再手动调用一次 AllocConsole 来重新分配新的控制台实例给您的程序用作调试用途哦~ --- ### 方法三:利用 WinMain 替代 main 函数入口点 另一个避免启动时出现 CMD 的办法就是直接采用图形化的消息循环结构——也就是把传统 C/C++ 标准规定的 main 改成 WinMain ,这会让整个过程完全脱离对终端环境的需求。 示例代码片段如下所示: ```cpp #include <windows.h> #include <tchar.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){ MSG Msg; HWND hWnd; WNDCLASS wc = { CS_HREDRAW | CS_VREDRAW, WndProc, 0, 0, hInstance, NULL, LoadCursor(NULL,IDC_ARROW), (HBRUSH)(COLOR_WINDOW+1), NULL, _T("MyApp")}; RegisterClass(&wc); hWnd=CreateWindow(_T("MyApp"),_T("No Console Example"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hWnd,nShowCmd); UpdateWindow(hWnd); while(GetMessage(&Msg,NULL,0,0)){ TranslateMessage(&Msg); DispatchMessage (&Msg ); } return Msg.wParam ; } // Window Procedure function definition here. LRESULT CALLBACK WndProc(/*...*/){ /* ... */ } ``` 以上即为如何于 C++隐藏掉恼人的黑色矩形框体之技巧分享啦~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值