2011-11-03 131 views
2

我正在使用C和GTK +进行gui项目。对于我的项目,我必须进行大量的系统调用。例如system(“copy myfile urfile”);或系统(“mp3player -embed文件名”)等,每当我的程序调用系统时,出现一个令人讨厌的控制台窗口,并保持可见状态,直到命令完全执行。如何隐藏该控制台窗口?谢谢。如何在进行系统调用时停止显示控制台窗口?

注意:对于我的项目,我可以使用GTK +,C标准库,GLib,WinApi(不推荐)和系统调用。

截图: annoying console window

+0

可能的重复[如何摆脱控制台与GTK编写GUI程序在C?](http://stackoverflow.com/questions/2752479/how-do-i-get-rid-of-在控制台,当写作gui程序与gtk-in-c) – ptomato

+1

对不起,我点击得太快了。这根本不是重复的。请原谅近距离投票。 – ptomato

+0

@ptomato没问题。 :) – ApprenticeHacker

回答

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

当'CopyFile(“myfile”,“urfile”,FALSE)时,他为什么需要命令解释器来复制'myfile urfile';'应该可以正常工作? http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx – IronMensan

+0

不要使用像CreateProcess这样的特定于平台的函数,请参阅下面的答案。 – liberforce

-2

Here is the related answer

决不使用putStr,打印,getContents等,如果你这样做,你会得到 “hPutChar(标准输出):无效的文件descriptior” 异常。这是因为Windows GUI程序的标准输入/输出/错误未连接,因此标准文件描述符无效。

隐藏控制台窗口是编译程序时,必须通过特殊的连接器选项的方式:

ghc --make Foo.hs -optl-mwindows 
+3

这不适用于C,它适用于Haskell。我正在使用C. – ApprenticeHacker

相关问题