Windows启动时C ++应用程序自动运行

时间:2011-10-09 22:11:34

标签: c++ windows autorun

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

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

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

  1. 如何检测启动文件夹。我对 SHGetSpecialFolderLocation()的输出不满意。它似乎在测试WinXP平台时返回我的“HOME”目录(C:\ Documents and settings \%username%)。
  2. 如何使用C ++创建.lnk文件?我认为复制整个.exe文件是个坏主意。
  3. 实际上我的程序是跨平台的,但选项“autostart”将仅限于Windows。

    更新

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

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

3 个答案:

答案 0 :(得分:3)

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

更新:

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

UPDATE2:

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

答案 1 :(得分:0)

为了清楚起见,启动文件夹项目在登录时发生,而不是启动。这听起来像你想要的,我只想直接得到这些条款。

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

答案 2 :(得分:0)

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

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

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