如何检测从“启动”文件夹快捷方式启动?

Posted

技术标签:

【中文标题】如何检测从“启动”文件夹快捷方式启动?【英文标题】:How to detect launching from a "Startup"-folder shortcut? 【发布时间】:2009-01-19 06:26:41 【问题描述】:

我需要在我的程序 CintaNotes 中添加“Windows 启动时运行”选项,但不想牺牲它的“清洁度”:它是 100% 可移植的免费软件,不应在系统中留下痕迹。 我想出了从启动快捷方式自动检测运行并自动最小化到系统托盘的想法。有没有办法做到这一点?我正在使用 C++ 和原始 Winapi。

所以: - 不写入注册表 - 无命令行参数

谢谢!

UPD:问题不是如何最小化到系统托盘!问题是程序如何在不使用注册表和命令行参数的情况下区分正常运行和从启动文件夹快捷方式运行。

【问题讨论】:

您是在使用 .NET 框架 (Visuall C++.NET) 还是只使用带有 Winapi 的 C++? 【参考方案1】:

您的“清洁”似乎充其量只是一种人为的构造。如果您告诉用户在启动文件夹中创建快捷方式,那么您已经留下了足迹(老实说,“myprog.exe”和“myprog.exe -m”之间几乎没有区别) .在这种情况下,有一些比自动尝试检测您从哪里奔跑更简单的方法。

我只需在您的程序中提供一个菜单选项(“安装”),然后将软件安装到固定磁盘位置(而不是闪存驱动器),包括必要的程序条目(开始、所有程序、 CintaNotes)。

作为该过程的一部分(甚至在安装之后),您可以让他们指定“从 Windows 启动”,然后您为用户创建启动文件夹快捷方式使用命令行选项所以你的程序可以判断它是否以这种方式运行。除非程序可用(即在固定磁盘上,而不是闪存驱动器上),否则允许“从 Windows 启动”是没有意义的。

您的用户根本不必担心创建快捷方式,更不用说带有参数的快捷方式了。这使您的程序可以控制它的运行方式 - 两种模式,“已安装”(并开始最小化)或“运行而不先安装”(并正常启动)。

诸如查找可执行文件的目录之类的操作不会起作用,因为启动程序的启动文件夹项很可能是它的快捷方式,因此您将没有该路径。

我认为这是一个典型的问错问题的案例。在回答您的具体问题时,我说:不,如果没有一些命令行参数,就无法判断您是从启动文件夹条目启动的。但是,我以前错了,请问我的妻子 :-)。其他人可能知道方法。

添加一个编辑,因为 cmets 不允许足够的空间:

你问:

当程序检测到它正在从闪存驱动器运行时,您如何看待仅禁用“Windows 启动时启动”选项?我想有办法检测到这一点。

这是个好主意,因为在安装之前允许自动运行是没有意义的(因为闪存驱动器可能不存在)。一种可能:

1/ 从 Flash 运行,您从“myprog.exe”开始,因为您只需双击可执行文件并在普通窗口中运行。这提供了“安装到固定磁盘”选项,但没有“从 Windows 启动”选项。作为安装过程的一部分,您可以允许他们将安装的副本设置为“从 Windows 开始”,而不是当前运行的副本。

2/ 您已安装的程序可以设置为以“myprog.exe -i”运行,因为您在 Start/AllPrograms 中创建了该项目。这将禁用“安装到固定磁盘”,但允许您切换“从 Windows 启动”。您可以选择是否希望显式运行(由用户)正常启动或最小化(参见 (3))。

3/ StartUp 中的快捷方式可以是“myprog.exe -s”(同样,您可以控制它,因为它是您创建的)。这与 (2) 相同,但开始最小化(如果 (2) 无论如何都开始最小化,则 (2) 和 (3) 之间没有区别,也没有理由使用不同的命令行选项)。

这样,每个选项都可以有你认为合适的不同行为。

【讨论】:

好的,谢谢,你说服了我 :) 当程序检测到它正在从闪存驱动器运行时,你认为禁用“Windows 启动时启动”选项会怎样?我想有办法检测到这一点。 谢谢,这是一个不错的解决方案。【参考方案2】:

即使您已经解决了问题,我只想说,可以检测程序是否从快捷方式启动。获得快捷方式路径后,您可以将其与启动文件夹进行比较。

请参阅“检测可执行文件是否从快捷方式启动”部分 "Undocumented CreateProcess

【讨论】:

【参考方案3】:

检查注册表中的此项。 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 并添加一个新的字符串键,并将应用程序的路径作为值。并使用 NOTIFYICONDATA 结构将您的应用程序最小化到托盘。

【讨论】:

问题是我不想写入注册表。 此应用程序在哪个操作系统中运行。? 和?程序应该如何检测它应该最小化运行?正如我所说,没有命令行参数:快捷方式将手动放入“启动”文件夹 您可以在 Google 上搜索 NOTIFYICONDATA,这是一种用于将应用程序最小化为托盘图标的结构。 当你想在系统托盘中显示你的应用图标时,调用win API Shell_NotifyIcon()【参考方案4】:

你为什么不使用一个参数来启动最小化的应用程序:

YourProgram.exe -m

【讨论】:

我希望用户自己在“启动”文件夹中创建这个快捷方式,并且我想让它尽可能简单,这意味着:不要乱用命令行参数。

以上是关于如何检测从“启动”文件夹快捷方式启动?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以从 Python 可执行文件访问启动快捷方式目录?

如何通过主屏幕上的快捷方式启动 Android Python 脚本

Android 应用程序未从快捷方式启动

WPF 开发自动开机启动程序

[Winfrom] 使用一个启动快捷方式,打开2个不同的窗体并且共用一个缓存空间

everything 如何用作快速启动工具