windows 从 cmd 启动和双击
linux 从 shell 启动和双击
程序有办法知道自己是怎样启动的么?我想实现用命令就没界面,双击就打开界面。
windows 从 cmd 启动和双击
linux 从 shell 启动和双击
程序有办法知道自己是怎样启动的么?我想实现用命令就没界面,双击就打开界面。
我觉得没区别。
不过我觉得可以有一个办法绕过去:因为程序是自己写的嘛,所以可以在安装脚本里自定义用户桌面图标的命令,比如你的程序叫abc.exe
,安装过程中在创建桌面图标时可以加一个参数就变成了abc.exe -from=click
这样的,绝大多数用户会直接双击这个图标启动,那你根据这个参数就知道他是从桌面启动的了。
当然我们不排除有少部分用户他就是要故意删除桌面图标,再自己新建一个愣是不带参数的图标然后再双击启动,我觉得这种毕竟属于少数,先不用考虑那么多。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
本身其实是没有区别的,不过为了实现你这个效果,一般是处理为2个程序,
1个其实是真实的程序,另外一个其实只是一个启动器,方便程序判断,
比如 abc是真正的程序,abcw是一个调用器,这样在不同的环境中需要点击的地方,连接到那个调用器。
调用器其实是以特定的参数来调用abc程序,比如 abc --windows
,这样abc就可以显示窗口。
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.4k 阅读✓ 已解决
2 回答813 阅读✓ 已解决
2 回答3.3k 阅读
Windows 上是有区别的。
GUI 界面下双击启动程序,其进程的父进程会是 explorer.exe;通过 cmd 命令行启动的程序,其父进程会是 cmd.exe;通过 powershell 命令行启动的程序,其父进程会是 powershell.exe ……
简而言之,通过谁启动(双击的行为实质是通过资源管理器)、父进程就是谁。你可以在程序内部判断自身的父进程是不是 explorer.exe,就知道是不是通过双击启动的了。
当然了,这个行为是可以被欺骗的,但 Windows 正常途径操作的话,一定是谁启动、父进程就是谁 —— Windows 又没骗你的必要,只有那些恶意程序才需要伪装。
Linux GUI 不太熟悉,不清楚,但想来也是类似的逻辑,你可以自己试验一下。
P.S. 有一种情况稍稍特殊一些,就是脚本语言(Python、PHP、Perl 之类的)。双击启动的实质是个“壳”(Shell),然后再由这个壳程序来解释执行真正的程序,这个过程中对于你的代码来说,父进程可能会是这个壳、而不是壳的父进程了。