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

时间:2009-01-19 06:26:41

标签: c++ windows winapi startup windows-shell

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

所以: - 没有写入注册表 - 没有命令行参数

谢谢!

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

4 个答案:

答案 0 :(得分:3)

你的“清洁”似乎是一种充满人为的结构。如果您告诉用户在启动文件夹中创建快捷方式,那么您已经留下了足迹(说实话,“myprog.exe”和“myprog.exe -m”之间没有什么区别) 。在这种情况下,有一些比自动尝试检测您正在运行的地方更简单的方法。

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

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

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

找到可执行文件的目录之类的东西不会起作用,因为启动程序的启动文件夹项可能是它的快捷方式,所以你不会有那条路径。

我认为这是一个提出错误问题的经典案例。在回答您的具体问题时,我说:不,没有办法告诉您已经从启动文件夹条目启动而没有一些命令行参数。但是,我以前错了,只要问我的妻子:-)。其他人可能都知道一种方式。

添加此编辑,因为注释不允许足够的空间:

你问:

  

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

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

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

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

3 / StartUp中的快捷方式可以是“myprog.exe -s”(再次,您可以控制它,因为您创建了它)。这与(2)相同,但是开始最小化(如果(2)开始最小化,则(2)和(3)之间没有区别,并且没有不同命令行选项的原因。)

这样,每个选项可以根据您的需要设置不同的行为。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

检查注册表中的此密钥。 HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \运行并添加一个新的String键,其中应用程序的路径为值。并使用NOTIFYICONDATA结构最大限度地减少您在托盘上的应用。

答案 3 :(得分:0)

为什么不使用参数来启动应用程序最小化,如:

YourProgram.exe -m