我正在使用C和GTK +进行gui项目。对于我的项目,我必须进行大量的系统调用。例如system(“copy myfile urfile”);或系统(“mp3player -embed文件名”)等,每当我的程序调用系统时,出现一个令人讨厌的控制台窗口,并保持可见状态,直到命令完全执行。如何隐藏该控制台窗口?谢谢。如何在进行系统调用时停止显示控制台窗口?
注意:对于我的项目,我可以使用GTK +,C标准库,GLib,WinApi(不推荐)和系统调用。
截图:
我正在使用C和GTK +进行gui项目。对于我的项目,我必须进行大量的系统调用。例如system(“copy myfile urfile”);或系统(“mp3player -embed文件名”)等,每当我的程序调用系统时,出现一个令人讨厌的控制台窗口,并保持可见状态,直到命令完全执行。如何隐藏该控制台窗口?谢谢。如何在进行系统调用时停止显示控制台窗口?
注意:对于我的项目,我可以使用GTK +,C标准库,GLib,WinApi(不推荐)和系统调用。
截图:
使用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
)。
当'CopyFile(“myfile”,“urfile”,FALSE)时,他为什么需要命令解释器来复制'myfile urfile';'应该可以正常工作? http://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx – IronMensan
不要使用像CreateProcess这样的特定于平台的函数,请参阅下面的答案。 – liberforce
决不使用putStr,打印,getContents等,如果你这样做,你会得到 “hPutChar(标准输出):无效的文件descriptior” 异常。这是因为Windows GUI程序的标准输入/输出/错误未连接,因此标准文件描述符无效。
隐藏控制台窗口是编译程序时,必须通过特殊的连接器选项的方式:
ghc --make Foo.hs -optl-mwindows
这不适用于C,它适用于Haskell。我正在使用C. – ApprenticeHacker
使用GLib processes spawning functions,而不是特定于平台的功能。对于文件副本,您可以使用GIO(随GTK提供)中的g_file_copy,而不是调用cp或copy命令。这使得你的代码更具可移植性。
可能的重复[如何摆脱控制台与GTK编写GUI程序在C?](http://stackoverflow.com/questions/2752479/how-do-i-get-rid-of-在控制台,当写作gui程序与gtk-in-c) – ptomato
对不起,我点击得太快了。这根本不是重复的。请原谅近距离投票。 – ptomato
@ptomato没问题。 :) – ApprenticeHacker