禁用显示控制台窗口

14

我该如何在 Microsoft Visual C++ 中禁用控制台窗口显示?

6个回答

26

在您的控制台应用程序中,转到

Properties > Linker > System 

SubSystem更改为Windows

并在您的代码中替换

int _tmain(int argc, _TCHAR* argv[])

使用

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
并添加
#include <windows.h>

这应该可以避免在控制台应用程序中显示控制台窗口。


3
对于未来的谷歌搜索者:您不必更改子系统。如果未选择任何子系统(控制台项目的默认设置),只需将“_tmain”替换为“_tWinMain”即可。 - Navin
如果我们正在编写符合标准的程序,而没有 Windows 奇怪的虚假’main’函数会怎么样? - anon
@NicHartley 这个解决方案是实现这个目标的一种方式。它可能不完整。如果您的要求更严格和微妙,请花些时间阅读相关的win api文档,而不是期望复制粘贴答案。 - Indy9000
有人知道在CMake项目中如何实现吗? - a_girl

3
您可以在启动时将其隐藏。我不知道这是否会导致闪烁:
HWND hWnd = GetConsoleWindow();
ShowWindow( hWnd, SW_HIDE );

7
未来的谷歌员工们——当我使用此功能时,我看到控制台闪烁。 - Shai

3

针对我的情况(vs2022 c++),我所做的只是:

修改

int main() {

int WinMain() {

并且

属性 > 链接器 > 系统 将 子系统 改为 Windows


3

您可以通过操纵预编译的EXE子系统来禁用控制台-这样您就不需要在代码中进行任何更改,因为您正在处理最终产品-消极方面是每次重新编译项目时都需要这样做。 您可以通过HEX编辑器或使用免费的CFF Explorer来完成。

  1. 通过CFF Explorer打开EXE文件
  2. 转到Nt Headers>Optional Header
  3. 导航到Subsystem并在右侧单击Windows Console,然后选择Windows GUI
  4. 保存文件,则控制台将不再出现

您可以进行二进制比较并查找原始PE标头中的确切位置,然后可能在VS中完成一些自动化操作。


这个可行 -- 尽管我个人在Linux HT十六进制编辑器方面很幸运。不过很难自动化。 - Vincent Fourmond
也许有一种方法。x32和x64可执行文件的PE是不同的。我正在编写一个Python脚本来禁用ASLR,因此GUI/Console标志应该在早期某个地方-只需要计算一些地址。MSDN是关键。 - MaKiPL

1

针对CMake用户。

add_executable(${exeName} WIN32)

你需要使用 WinMain 代替 main 作为入口点符号。


0

你的问题相当模糊,所以我会尝试按照我的理解来回答... 如果你不想要一个控制台窗口,可以尝试使用不同的子系统。具体来说,你可能需要使用Windows或Native子系统,而不是Console子系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接