首页| 论坛| 消息

标题:在CONFIG +=console状态下,如何手动隐藏控制台?
作者:ragtime
日期:2023-05-30 14:39
内容:

现在准备制作一个 GUI + 控制台混合的程序,两种运行状态有区别。
既可以双击exe正常启动,也可以命令行启动。
在main函数进行处理,判断进来有没有参数,有就不展示界面,没有就展示界面但是隐藏命令行窗口。
这种可以实现吗?
不止windows,也要考虑苹果MAC端。


#1 [uidab 05-30 20:03]
自己试试啊,你都说得很清楚了。
#2 [fsu0413 05-30 20:16]
印象中mac下需要app bundle才能做纯GUI,而app bundle双击就是不会出命令行的。要用命令行得用命令行手敲进bundle里面,所以好做。
windows不好弄。subsystem=console一定会开命令行。而subsystem=windows一定没有命令行。有没有命令行是链接时决定的,不是运行时决定的。
之前在公司用过一个windows上的软件(名字不便透露,是客户提供的)是做成弹出命令行但是后续自行关闭的这种,不过我升级windows11之后这个软件关闭命令行的功能失效了,可能是我把默认终端改成了windows terminal导致接口不一样的原因。
我的思路是全平台双可执行程序,如果满足开gui的条件,则在main函数里直接exec到gui程序里。
exec在Windows上是开新进程的,应该可以满足中止终端程序的要求,而在unix系列系统里(macos就是)则是就地将命令行程序替换为gui程序。
#3 [spygg 05-31 09:33]
楼上的思路已经是比较好的解决方式了,为此还深扒了下Qt的源码发现subsytem=windows 时候入口函数是WinMain, 在windows下如果想实现隐藏用FindWindow查找窗口句柄然后隐藏
HWND h = ::FindWindow(NULL, reinterpret_cast( a.applicationFilePath().replace("/", "\\").data()));
if(h)
::ShowWindow(h, SW_HIDE);
#4 [hitler++ 05-31 15:16]
subsystem=windows ,启动要弹出命令行时候打开一个新进程cmd.exe 将 管道重定向到这个进程,这样cout cin 等可以直接到这个cmd.exe
#5 回 spygg 的帖子 [fsu0413 05-31 20:08]
spygg:楼上的思路已经是比较好的解决方式了,为此还深扒了下Qt的源码发现subsytem=windows 时候入口函数是WinMain, 在windows下如果想实现隐藏用FindWindow查找窗口句柄然后隐藏
    HWND h = ::FindWindow(NULL, reinterpret_cast( a.applicatio .. (2023-05-31 09:33) 
这种很显然在Windows11下windows terminal为默认终端的情况用不了。。。

<< 1 2 >> (1/2)

回复 发表
主题 版块