如何在进行系统调用时停止出​​现控制台窗口?

时间:2011-11-03 11:12:49

标签: c winapi user-interface console gtk

我正在使用C和GTK +作为gui项目。对于我的项目,我必须进行大量的系统调用。例如system(“copy myfile urfile”);或者系统(“mp3player -embed filename”)等等。每当我的程序调用系统时,会出现一个恼人的控制台窗口,并且在命令完全执行之前一直保持可见状态。如何隐藏控制台窗口?感谢。

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

截图: annoying console window

3 个答案:

答案 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)

Here is the related answer

永远不要使用putStr,print,getContents等。如果你这样做,你会得到一个例外,例如“hPutChar(stdout):无效的文件描述符”。这是因为Windows GUI程序的标准输入/输出/错误未连接,因此标准文件描述符无效。

隐藏控制台窗口的方法是在编译程序时传递一个特殊的链接器选项:

ghc --make Foo.hs -optl-mwindows