隐藏 Windows 应用程序的控制台

Posted

技术标签:

【中文标题】隐藏 Windows 应用程序的控制台【英文标题】:Hide console of Windows Application 【发布时间】:2011-01-09 12:35:57 【问题描述】:

我有一个 Qt 应用程序,当我运行这个应用程序时,它后面会打开一个控制台。在开发中这很好,因为我在控制台上看到了调试输出,但是当我想将此可执行文件提供给客户时,应该没有控制台窗口。 怎么隐藏?

(我使用的是 Visual Studio 2008)

【问题讨论】:

最好的办法是制作一个QT项目并使用QVTKWidget。 【参考方案1】:

在项目构建链接器选项集中

/SUBSYSTEM:windows
/ENTRY:mainCRTStartup

或者在源文件中使用下面的#pragmaint main(...)

#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")

【讨论】:

Imo 是最好的和中肯的答案,同时处理子系统部分和不同的入口点部分。小 unicode 提示:如果您使用 unicode 编译并且使用 wmain 而不是 main,则注释应为“/ENTRY:wmainCRTStartup”。 @GuyJoelMcLean:专业提示:如果您稍后需要控制台进行调试,您可以使用 AllocConsole msdn.microsoft.com/en-us/library/windows/desktop/… 在 VS 2010 中,编译指示对我不起作用。我必须通过项目属性设置这两个设置,从预处理器中删除 _CONSOLE。然后我重新构建,它运行良好。 这应该是公认的答案。例如。如果您在 Windows 上使用 CMake 进行开发,这是唯一的选择。此外,它还可以移植到其他窗口系统,例如 GLFW、SDL、... 这很有帮助!【参考方案2】:

听起来您的链接器配置不正确。右键单击项目、属性、链接器、系统、子系统设置。确保选择“Windows”,而不是“控制台”。

并且,将 main() 更改为 WinMain()。

【讨论】:

main() 和 WinMain() 有区别吗? 您也可以在属性 -> 链接器 -> 高级 -> 入口点中将项目的入口点设置为标准main() 问题是当我将程序转到Windows 时,即使我修复了main/WinMain 问题,它也不会终止。 @JanTuroň 怎么样?我们在那个领域放了什么选项?这是一个字符串字段,我尝试了各种各样的解决方案,但都不起作用。 @NicHartley 在 2008 年应该是一个选择框。 Perharps 配置中还有其他设置。您能否再问一个问题并提供逐步设置以重现该问题?【参考方案3】:

你可以通过调用来摆脱控制台:

FreeConsole();

【讨论】:

你必须#include <Windows.h>才能这样做【参考方案4】:

我用了那个方法,效果很好

HWND hwnd = GetConsoleWindow();
ShowWindow(hwnd, 0);

【讨论】:

如果你从命令行启动程序,命令行会消失。 FreeConsole 没有这个问题。【参考方案5】:

下一个解决方案;)

环境:WixXP x64,msvs 2008,Qt v4.5.3

    设置项目设置/配置属性/链接器/系统/子系统 = Windows (/SUBSYSTEM:WINDOWS)

    但对于 x64 存在链接器错误: LNK2019:未解析的外部符号 _WinMain 在函数 _WinMainCRTStartup 中引用” 避免它

    替换以下代码:

    int main(int argc, char *argv[])
    
         QApplication app(argc, argv);
         // your code*
    
    

    通过

    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd)
    
        int argc = 0;
        QApplication app( argc, 0 );
     
    

它适用于 Win32 和 x64 平台。

【讨论】:

这个方法会阻止程序从命令行获取参数。非常非常糟糕的主意。 -1。如果您想正确执行此操作,请将您收到的字符串标记为 WinMain 的第三个参数。是的,有很多 Windows 程序可以解释命令行参数。例如,Windows 资源管理器中的“打印”上下文菜单使用命令行参数启动程序。 datenwolf,它们仍然存在使用 __argv 和 __argc 宏(至少在 MSVC 中)或 GetCommandLine/CommandLineToArgv winapi 函数。 这为我解决了这个问题。非常感谢:))【参考方案6】:

可能更好的选择不是简单地删除(如 Andy M 建议的那样),而是编辑 *.pro 文件添加类似的内容

CONFIG(debug, debug|release) 
    CONFIG *= console
 
else 
    CONFIG -= console

在调试中您可以看到控制台窗口,但在发布中看不到。我喜欢。 =)

【讨论】:

【参考方案7】:

如果您使用属性->链接器->系统->子系统 | Windows

并得到一个链接器错误。

你可以看看Linker->Advanced->Entry Point

并将值设置为“主”函数的名称。

如果您的主要功能是“主要”,那么您的入口点就变成了主要的。

【讨论】:

【参考方案8】:

我建议检查您的 .PRO 文件中是否存在以下行:

CONFIG += console

如果你能找到它,删除它!它应该可以解决您的问题!

希望对你有帮助!

【讨论】:

实际的 Visual Studio 项目是使用 QMake 项目文件中的配置参数创建的,所以这很可能是原因。 Erm,在 VCProj 属性中,可能通过进入 Links Edition、System 和最后的 Subsystem...尝试输入值“Windows (/SUBSYSTEM:WINDOWS)”...我不是真的当然你可以这样做...... 我在我的一个应用程序中快速进行了测试,出于某种不明原因,我需要添加以下库:c:\...\Qt\4.6.0-vs2008\lib\qtmain.lib在 VCProj Properties-> Links Edition -> Entry -> Additionnal Dependencies 看来这是最终的解决方案 :) lists.trolltech.com/qt-interest/2005-12/thread00170-0.html【参考方案9】:

对于那些直接编辑 .vcxproj 的人,您希望将具有值 WindowsSubSystem 添加到您的 Link ItemDefinitionGroup,如下所示:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Windows</SubSystem>
  </Link>
</ItemDefinitionGroup>

【讨论】:

【参考方案10】:

转到:Projects --&gt; Run 并取消选中 Run in terminal 复选框

【讨论】:

【参考方案11】:

步骤 1:- 设置属性->链接器->系统->子系统是“Windows (/SUBSYSTEM:WINDOWS)” 第2步:-链接器->高级->入口点“main”

【讨论】:

【参考方案12】:

这对我有用:

CONFIG(debug, debug|release) 
    CONFIG *= console
 
else 
    CONFIG -= console

我需要运行一个 exe 来使用 QFileSystemWatcher 监控文件,所以我使用了这个:

CONFIG -= console

【讨论】:

以上是关于隐藏 Windows 应用程序的控制台的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python Tkinter 隐藏 Windows 控制台?

如何在 Windows/Mac/Linux 中创建隐藏文件?

如何隐藏 C 程序的控制台窗口?

如何在隐藏控制台的情况下运行 C# 控制台应用程序

Windows NT/系统进程的隐藏技术

GCC/C如何隐藏控制台窗口?