我正在使用C和GTK +作为gui项目。对于我的项目,我必须进行大量的系统调用。例如system(“copy myfile urfile”);或者系统(“mp3player -embed filename”)等等。每当我的程序调用系统时,会出现一个恼人的控制台窗口,并且在命令完全执行之前一直保持可见状态。如何隐藏控制台窗口?感谢。
注意:对于我的项目,我可以使用GTK +,C标准库,GLib,WinApi(不推荐)和系统调用。
截图:
答案 0 :(得分:2)
使用system()
创建一个新进程,首先启动一个新的命令解释器,然后执行传递给system()
的命令。
命令解释程序打开控制台窗口。
因此,为了避免打开这样的控制台窗口,您需要避免启动命令解释程序。要执行后者,请尝试使用spawn
系列(http://msdn.microsoft.com/en-us/library/20y988d2.aspx)中的函数,或使用win32 api函数CreateProcess()
(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425)直接启动应用程序。
这样做的副作用可能是,您的应用程序启动速度更快,并且使用的系统资源也更少。
事实上,上述解决方案不适用于明确需要命令解释器的系统调用,如您的一个示例(copy src dst
)。
答案 1 :(得分:0)
使用GLib processes spawning functions代替特定于平台的功能。对于文件复制,您可以使用GIO(GTK附带)中的g_file_copy,而不是调用cp或copy命令。这使您的代码也更具可移植性。
答案 2 :(得分:-2)
永远不要使用putStr,print,getContents等。如果你这样做,你会得到一个例外,例如“hPutChar(stdout):无效的文件描述符”。这是因为Windows GUI程序的标准输入/输出/错误未连接,因此标准文件描述符无效。
隐藏控制台窗口的方法是在编译程序时传递一个特殊的链接器选项:
ghc --make Foo.hs -optl-mwindows