Rob*_*ish 4 c++ startup windows-8
我们如何让我们的应用程序在计算机启动时启动(当然,在用户登录后)?不,我没有制造病毒.
注册表编辑听起来像个好主意吗?
我的操作系统是Windows 8.
但是,我将尝试使我的应用程序可用于所有可能的Window OS.
正确的方法是将应用程序可执行文件的快捷方式添加到用户的Startup文件夹中.您不需要(也不应该)修改注册表.
高级用户已经知道如何手动执行此操作,但它也可能是您希望作为安装程序的一部分和/或应用程序中的配置对话框提供的选项.
要从C++代码执行此操作,您需要做两件事:
检索当前用户的Startup文件夹的位置.
这是通过调用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");
}
}
Run Code Online (Sandbox Code Playgroud)
但请注意,虽然SHGetKnownFolderPath是推荐使用的功能,但Windows Vista及更高版本仅支持它.如果您需要支持较旧版本的操作系统,则需要在可用的较新版本上动态调用它,否则将回退到调用该SHGetFolderPath函数.这个采用不同类型的标识符,即CSIDL值.你想要的是CSIDL_STARTUP.
创建应用程序可执行文件的快捷方式.
这是使用一组不同的Shell API函数完成的.我不打算在这里编写示例代码,因为它已经在MSDN上得到了很好的解释:Shell Links
现在您只需连接点:当您创建应用程序可执行文件的快捷方式时,请将用户的Startup文件夹指定为其目标路径.
唯一需要注意的是,实际上有多个Startup文件夹.每个用户都有一个,这是我们上面使用的那个FOLDERID_Startup.大约99%的时间,这就是你想要的那个.为您的应用设置快捷方式会导致该用户登录时自动启动.
但是,还有一个由所有用户共享的全局 Startup文件夹.这个由FOLDERID_CommonStartup(或CSIDL_COMMON_STARTUP)标识,并需要管理权限才能添加项目.当然,这是有道理的,因为无论你输入什么内容都会在任何用户登录计算机时自动启动.只有管理员可以影响这样的全局行为.可能的是,你的应用程序无论如何都不需要这个.