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

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

(我使用的是 Visual Studio 2008)

【问题讨论】:

  • 最好的办法是制作一个QT项目并使用QVTKWidget。

标签: windows visual-studio qt console hide


【解决方案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

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

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

  2. 替换以下代码:

    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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-30
              • 2011-04-20
              • 2011-04-04
              • 1970-01-01
              • 2015-09-17
              • 2010-12-08
              相关资源
              最近更新 更多