我们如何让我们的应用程序在计算机启动时启动(当然,在用户登录后)? 不,我没有制造病毒。
注册表编辑听起来是个好主意吗?
我的操作系统是 Windows 8。
但是,我会尝试使我的应用程序适用于所有可能的 Window 操作系统。
最佳答案
执行此操作的正确方法是将应用程序的可执行文件的快捷方式添加到用户的“启动”文件夹中。您不需要(也不应该)修改注册表。
高级用户已经知道如何手动执行此操作,但它也可能是您希望作为安装程序的一部分和/或应用程序中的配置对话框提供的选项。
要从 C++ 代码执行此操作,您需要做两件事:
检索当前用户的启动文件夹的位置。
这是通过调用
SHGetKnownFolderPath
来完成的函数并指定KNOWNFOLDERID
您感兴趣的文件夹的名称。在本例中,这将是FOLDERID_Startup
。示例代码:
std::wstring GetStartupFolderPath() { PWSTR pszPath; HRESULT hr = SHGetKnownFolderPath(&FOLDERID_Startup, 0, // no special options required NULL, // no access token required &pszPath); if (SUCCEEDED(hr)) { // The function succeeded, so copy the returned path to a // C++ string, free the memory allocated by the function, // and return the path string. std::wstring path(pszPath); CoTaskMemFree(static_cast<LPVOID>(pszPath)); return path; } else { // The function failed, so handle the error. // ... // You might want to throw an exception, or just return an // empty string here. throw std::runtime_error("The SHGetKnownFolderPath function failed"); } }
但是请注意,虽然
SHGetKnownFolderPath
是推荐使用的函数,但它仅受 Windows Vista 及更高版本支持。如果您需要支持旧版本的操作系统,则需要在可用的新版本上动态调用它,否则回退到调用SHGetFolderPath
功能。这一个采用不同类型的标识符,一个 CSIDL值(value)。您想要的是CSIDL_STARTUP
。创建应用程序可执行文件的快捷方式。
这是使用一组不同的 Shell API 函数完成的。我不会在这里写示例代码,因为它已经在 MSDN 上得到了很好的解释:Shell Links
现在您只需连接点:当您创建应用程序可执行文件的快捷方式时,将用户的启动文件夹指定为其目标路径。
唯一需要注意的是实际上有多个启动文件夹。每个用户都有一个,也就是我们在上面使用 FOLDERID_Startup
检索到的那个。大约 99% 的时间,这就是您想要的。将您的应用程序的快捷方式放在那里将导致它在该用户登录时自动启动。
但是,还有一个由所有用户共享的全局 启动文件夹。这个由 FOLDERID_CommonStartup
(或 CSIDL_COMMON_STARTUP
)标识,需要管理权限才能添加项目。当然,这是有道理的,因为当任何 用户登录到计算机时,无论您放在那里什么都会自动启动。只有管理员才能像这样影响全局行为。很有可能,您的应用程序根本不需要它。
关于C++ 我们如何让我们的应用程序在计算机启动时启动(当然,在用户登录后)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579932/