4

我正在用 C++ 开发一个具有“自动启动”选项的应用程序。当用户设置该选项时,程序应更改Windows 中的某些内容,以便在下次 Windows 启动和用户登录时由 Windows 启动。此外,当用户取消设置此选项时,程序必须将内容放回原处。

我不需要将应用程序作为服务运行,因此在用户登录后在某些用户帐户下运行就足够了。那么让Windows运行我的应用程序的最佳方法是什么。在下次启动和用户登录时?我搜索了一个使用启动文件夹的建议。这是最好的和无害的方式吗?

如果是这样,我有两个问题:

  1. 如何检测启动文件夹。我对SHGetSpecialFolderLocation()的输出不满意。它似乎在测试 WinXP 平台时返回了我的“HOME”目录(C:\Documents and settings\%username%)。
  2. 如何在那里使用 C++ 创建 .lnk 文件?我认为复制整个 .exe 文件是个坏主意。

实际上我的程序是跨平台的,但是“自动启动”选项将是仅限 Windows 的。

更新

  1. 尝试 SHGetSpecialFolderLocation 并在 Windows7 中获得了不错的价值:“C:\Users\Pavel\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup” 注意:如果使用 MinGW,则应在包含 ShlObj 之前将 _WIN32_IE 定义为 0x0400 。H。

  2. 使用注册表(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run)和启动文件夹之间的最佳解决方案(从良好编程的角度来看)是什么?

4

3 回答 3

4

我建议使用像HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run. 在此处使用您的软件名称和主要可执行路径的值创建一个字符串值 - 这应该足够了。比创建 .lnk 文件要容易得多 - 并且可以从 C++ 轻松访问注册表编辑 API

更新:

正如@Ben 建议的那样,对于您的任务,最好使用HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run. 这将仅为当前用户自动启动您的应用程序,而我的第一个建议将为所有用户执行此操作。

更新2:

另请注意,无论您选择哪种方法来实现自动启动,您都可能会遇到防病毒软件的问题,因为大多数具有主动防御功能的防病毒软件都在密切关注使程序自动运行。

于 2011-10-09T22:19:59.957 回答
1

需要明确的是,启动文件夹项发生在登录时,而不是启动时。这听起来像你想要的,我只是想把条款弄清楚。

我认为您实际上想要SHGetSpecialFolderPathCSIDL_STARTUP常量。如果我正确阅读文档,那应该会给你你想要的路径。

于 2011-10-09T22:21:46.293 回答
0

使用 SHGetSpecialFolderPath 确定启动文件夹的路径(请参阅 Michael Kohne 的回答)。

然后使用IShellLink在此文件夹中创建快捷方式。

编辑:我认为在注册表中使用 Run 键更可靠。

于 2011-10-10T08:48:07.010 回答