回复: 在CONFIG +=console状态下,如何手动隐藏控制台?
#6 [fsu0413 05-31 20:10]
还有 入口函数是winmain的情况下用 CommandLineToArgvW + WideCharToMultiByte 然后调回main就行了,Qt就是这么干的,可以看qtmain.lib
#7 回 fsu0413 的帖子 [spygg 06-02 09:11]
fsu0413:这种很显然在Windows11下windows terminal为默认终端的情况用不了。。。 (2023-05-31 20:08)
这个我还真测过,是可用的,用spy++抓包终端确实好几个别的窗口,但是一隐藏当前进程的窗口名之后竟然全部隐藏了,连任务栏都没剩
#8 回 spygg 的帖子 [fsu0413 06-02 22:01]
spygg:这个我还真测过,是可用的,用spy++抓包终端确实好几个别的窗口,但是一隐藏当前进程的窗口名之后竟然全部隐藏了,连任务栏都没剩 (2023-06-02 09:11)
Windows Terminal有一个设置,里面有个“新建实例行为”,把它改成“附加到此桌面上最近使用的窗口”
这个设置打开后,如果再开新终端,则不会在新的终端窗口里打开,而是在已有的窗口里新建标签页
在这种设置下,打开会隐藏终端窗口的软件,有下面两种情况之一可能发生:
1 FindWindow 找到窗口然后把窗口隐藏了,当前终端中的其他标签页也不可操作了,挂在后台,如果上面有任务跑着,这些跑着的任务就找不到了
2 FindWindow 找不到窗口,隐藏不了,终端一直开着,要实现的功能没了
#9 [spygg 06-16 17:19]
查资料发现windows系统会使用一个叫做conhost.exe来承接命令行,如果通过此程序来启动进程就不会出现各个版本不统一的情况了,cmd.exe不行,我把xp下的cmd.exe拷贝到win11下双击运行依然是多标签窗口(真是日了狗了)
此方法可以通过
HWND hwnd = GetConsoleWindow();
ShowWindow(hwnd,SW_HIDE);
来实现隐藏命令行窗口
===================================
在windows下双击启动的父进程是explorer.exe, 命令行启动的话父进程是(cmd, pwsh等),
针对楼主需求,可以使用非命令行程序,如果父进程是explore则分配控制台
AllocConsole();//打开控制台
freopen("CON","w",stdout);//将输出定向到控制台
当然qdebug()之类的也要重定向一份到输出到控制台
#10 回 spygg 的帖子 [fsu0413 06-17 13:28]
spygg:查资料发现windows系统会使用一个叫做conhost.exe来承接命令行,如果通过此程序来启动进程就不会出现各个版本不统一的情况了,cmd.exe不行,我把xp下的cmd.exe拷贝到win11下双击运行依然是多标签窗口(真是日了狗了)
此方法可以通过
HWND hwnd = GetConsoleWindow();
ShowWindow(hwn .. (2023-06-16 17:19)
cmd是那个脚本解释器,窗口在Windows 10之前一直是conhost,Windows 11开始可以变成默认是Windows Terminal。针对默认终端是windows terminal的情况,一定要判断我上面说的新建实例行为,把其他终端隐藏了就是有问题的了