程序从命令行启动和双击启动有什么不同?

windows 从 cmd 启动和双击
linux 从 shell 启动和双击
程序有办法知道自己是怎样启动的么?我想实现用命令就没界面,双击就打开界面。

阅读 7.1k
3 个回答

Windows 上是有区别的。

GUI 界面下双击启动程序,其进程的父进程会是 explorer.exe;通过 cmd 命令行启动的程序,其父进程会是 cmd.exe;通过 powershell 命令行启动的程序,其父进程会是 powershell.exe ……

简而言之,通过谁启动(双击的行为实质是通过资源管理器)、父进程就是谁。你可以在程序内部判断自身的父进程是不是 explorer.exe,就知道是不是通过双击启动的了。

当然了,这个行为是可以被欺骗的,但 Windows 正常途径操作的话,一定是谁启动、父进程就是谁 —— Windows 又没骗你的必要,只有那些恶意程序才需要伪装。

Linux GUI 不太熟悉,不清楚,但想来也是类似的逻辑,你可以自己试验一下。

P.S. 有一种情况稍稍特殊一些,就是脚本语言(Python、PHP、Perl 之类的)。双击启动的实质是个“壳”(Shell),然后再由这个壳程序来解释执行真正的程序,这个过程中对于你的代码来说,父进程可能会是这个壳、而不是壳的父进程了。

我觉得没区别。

不过我觉得可以有一个办法绕过去:因为程序是自己写的嘛,所以可以在安装脚本里自定义用户桌面图标的命令,比如你的程序叫abc.exe,安装过程中在创建桌面图标时可以加一个参数就变成了abc.exe -from=click这样的,绝大多数用户会直接双击这个图标启动,那你根据这个参数就知道他是从桌面启动的了。

当然我们不排除有少部分用户他就是要故意删除桌面图标,再自己新建一个愣是不带参数的图标然后再双击启动,我觉得这种毕竟属于少数,先不用考虑那么多。


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

本身其实是没有区别的,不过为了实现你这个效果,一般是处理为2个程序,
1个其实是真实的程序,另外一个其实只是一个启动器,方便程序判断,
比如 abc是真正的程序,abcw是一个调用器,这样在不同的环境中需要点击的地方,连接到那个调用器。

调用器其实是以特定的参数来调用abc程序,比如 abc --windows,这样abc就可以显示窗口。


已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题