隐藏 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
或者在源文件中使用下面的#pragma和int 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 的人,您希望将具有值 Windows
的 SubSystem
添加到您的 Link
ItemDefinitionGroup
,如下所示:
<ItemDefinitionGroup>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
【讨论】:
【参考方案10】:转到:Projects --> 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 控制台?