是否可以检测内部应用程序的运行位置?从cmd / bash还是从GUI?假设我们在图形模式下工作,而不是在纯控制台中工作。
答案 0 :(得分:2)
不是真的,但有点儿。简短的回答:最好不要尝试,让用户通过参数告诉你,你可以预先填写快捷方式。
答案很长:
在这两种情况下,程序都以类似的方式启动:shell应用程序(无论是cmd / bash还是Windows资源管理器/无论gui launcher linux有什么)在Windows上调用CreateProcess或ShellExecute或在Linux上调用fork + exec的方式用户执行它会迷路。
但是,该进程确实有一个可能有用的父ID ....但由于一些原因它不可靠:告诉它是gui还是命令行shell并不容易(你可以做的最好是查看图片名称),父母可能会在你启动后立即终止,所以没有父母! (Linux gui应用程序经常分叉自己从终端分离。当然,如果你这样做,你可能知道,但如果你使用一个库,它可能会在你没有意识到的情况下发生。)
嗯,事实上我在每一句话之后都在括号旁边显示出有多不可靠和复杂。如果你想尝试一下,在进行任何fork / detaching之前查看你的父进程ID可能会有所帮助。
BTW寻找父控制台并不是非常有用:即使一台Windows GUI子系统程序存在并且Linux GUI程序可能附加到X的控制tty,Windows GUI子系统程序也不会附加到父控制台窗口管理员。我实际建议的是将一个参数传递给你的函数来告诉它它是如何开始的。创建GUI快捷方式时,让它自动通过gui"你的争论。然后,您可以检查args
并做出相应的反应。
它仍然不是完美的,但它实现起来相当容易并且可能足够好 - gui发射器可能会使用快捷方式而你可以通过它们传递参数,因此用户并不需要了解它是如何实施的。
或者你可以安装两个程序,一个方便的命令行和一个针对gui环境优化的程序。
但我认为这是你能做的最好的事情。