CMake实践:VS2019控制台程序隐藏控制台方法

目录

1.代码运行时动态隐藏

2.编译层面彻底移除控制台

2.1.MSVC (VS 编译器)

2.2.MinGW (g++ 编译器)

2.3.CMake工程

3.总结

相关链接


1.代码运行时动态隐藏

依赖 Windows API,包含头文件 <windows.h>,两种常用 API:

1.隐藏控制台窗口(窗口看不见,但进程仍绑定控制台)

cpp 复制代码
#include <windows.h>
#include <iostream>

int main()
{
    // 获取控制台窗口句柄
    HWND hWnd = GetConsoleWindow();
    // SW_HIDE 隐藏;SW_SHOW 恢复显示
    ShowWindow(hWnd, SW_HIDE);

    // 你的业务逻辑
    Sleep(5000);
    return 0;
}

2.分离控制台(彻底解绑控制台,关闭 CMD 不影响程序)

cpp 复制代码
#include <windows.h>

int main()
{
    FreeConsole(); // 脱离控制台终端
    MessageBox(NULL, L"控制台已分离", L"提示", MB_OK);
    Sleep(5000);
    return 0;
}

缺点:程序运行瞬间会闪现一下黑框,因为操作系统先创建控制台再执行隐藏代码。

2.编译层面彻底移除控制台

修改链接器子系统为Windows 窗口程序,从根源不生成 CMD 黑窗口。

2.1.MSVC (VS 编译器)

代码添加编译指令(不用改项目配置)

cpp 复制代码
#include <windows.h>
// 链接器参数:子系统Windows,入口仍使用main
#pragma comment(linker, "/SUBSYSTEM:WINDOWS")
#pragma comment(linker, "/ENTRY:mainCRTStartup")

int main()
{
    MessageBox(NULL, L"无控制台窗口", L"提示", MB_OK);
    return 0;
}

2.2.MinGW (g++ 编译器)

编译时添加 -mwindows 参数:

cpp 复制代码
g++ main.cpp -o app.exe -mwindows

2.3.CMake工程

CMake 内置属性 WIN32_EXECUTABLE,开启后自动配置链接器 /SUBSYSTEM:WINDOWS,保留 main() 入口不用改成 WinMain,编译出来直接无控制台黑窗,是 CMake 标准方案。

cpp 复制代码
cmake_minimum_required(VERSION 3.16)
project(HideConsoleDemo)

# 生成可执行程序
add_executable(App main.cpp)

# 核心配置:开启Windows子系统,取消控制台黑框
set_target_properties(App PROPERTIES
    WIN32_EXECUTABLE TRUE
)

原理:CMake 自动追加链接参数:/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup,代码照常写 int main()。

按需配置:Debug 调试保留黑框,Release 隐藏(常用)

调试时想看日志留控制台,发布版本隐藏:

cpp 复制代码
add_executable(App main.cpp)

# Release隐藏控制台,Debug正常显示控制台
if (CMAKE_BUILD_TYPE MATCHES "Release|RelWithDebInfo|MinSizeRel")
    set_target_properties(App PROPERTIES WIN32_EXECUTABLE TRUE)
endif()

不想用WIN32_EXECUTABLE,手动指定链接选项:

cpp 复制代码
target_link_options(App PRIVATE
    "/SUBSYSTEM:WINDOWS"
    "/ENTRY:mainCRTStartup"
)

缺/ENTRY:mainCRTStartup会报 无法解析外部符号 WinMain。

3.总结

  • WIN32_EXECUTABLE TRUE = MSVC /SUBSYSTEM:WINDOWS,最优方案
  • 代码入口永远用main,不用 WinMain
  • 只在 Windows 平台生效,Linux/Mac 编译不受该属性影响。

相关链接

相关推荐
fpcc14 分钟前
c++20新功能—std::osyncstream
c++·c++20
H.莓飛15 分钟前
【C++】模板初阶
linux·开发语言·c++·visual studio
十五年专注C++开发16 分钟前
基于Asio2实现http服务器的实践总结(二)
服务器·c++·http·asio2
技术不好的崎鸣同学20 分钟前
第七章:模块踩踏以覆写导出函数绕过CFG
c++·windows·安全·系统安全
miofly21 分钟前
GitHub 今日推荐|ps2-web-recomp:浏览器里跑 PS2 游戏的静态重编译方案
c++·开源·github
黄一一91124322 分钟前
吾爱大佬开发,离线可用!PDF文件处理工具,本地网页版文件-浏览器里就能搞定,所有操作系统可用
windows·安全·阿里云·pdf·.net·开源软件
沫璃染墨37 分钟前
从零入门计算机网络系列(五):UDP套接字编程实战——从核心API到客户端与服务器通信
linux·网络·c++·vscode·网络协议·udp
hetao17338371 小时前
联盟场-提高组-R4 & ZYZSC-S-Round 7
c++·算法
hetao17338372 小时前
联盟场-提高组-R2 & ZYZSC-S-Round 5
c++·算法
牛马工作号2 小时前
Docker Compose 部署 FreeRADIUS:从 AAA 原理到 Windows 有线 802.1X 认证实战
windows·docker·容器