如何从控制台或 GUI 应用程序中检测到 运行?

How to detect from console or GUI app was run?

是否可以从 运行 的位置检测到应用程序内部?来自 cmd/bash 还是来自 GUI?假设我们在图形模式下工作,而不是在纯控制台下工作。

不是真的,但有点。简短回答:最好不要尝试,让用户通过参数告诉你,你可以预先填写一个快捷方式。

长答案:

在这两种情况下,程序都以类似的方式启动:shell 应用程序(无论是 cmd/bash 还是 Windows explorer/whatever gui launcher linux有) 在 Windows 上调用 CreateProcess 或 ShellExecute 或在 Linux 上调用 fork+exec 并且用户执行它的方式会丢失。

但是,该进程确实有一个可能有用的父 ID...但它也不可靠,原因有几个:判断它是图形用户界面还是命令行 shell 不是'这并不容易(最好的办法就是查看图像名称)并且父项可能会在您启动后立即终止,因此没有父项! (Linux gui 应用程序通常会自行分叉以从终端分离。当然,如果您这样做,您可能会知道,但如果您使用库,它可能会在您没有意识到的情况下发生。)

好吧,事实上我在每句话之后都在插入旁白,这表明这是多么不可靠和复杂。不过,如果您想尝试,在执行任何 fork/detaching 之前查看您的父进程 ID 可能会有所帮助。

顺便说一句,寻找父控制台并不是很有帮助:Windows GUI 子系统程序不会附加到父控制台,即使存在父控制台,并且 Linux GUI 程序可能附加到X window 管理器的控制终端。


我实际上建议的是将参数传递给您的函数以告诉它它是如何开始的。当您创建 GUI 快捷方式时,让它自动将 "started by gui" 参数传递给您。然后你可以检查 args 并做出相应的反应。

它仍然不完美,但它很容易实现并且可能已经足够好了 - 图形用户界面启动器可能无论如何都会使用快捷方式,你可以通过它们传递参数,所以用户不需要知道它是如何实现的。

或者您可以安装两个程序,一个在命令行中很方便,一个针对 gui 环境进行了优化。

但我认为这是你能做的最好的了。