将应用程序添加到启动(注册表)
Add Application to Startup (Registry)
我试图将我的软件添加到注册表,我发现了一些我可以使用的代码,但不是完整的工作代码C/c++对我来说是新的,不能自己创建它。但基本思想是这样的:检查是否设置了reg键,如果没有创建它。
我可以使用以下代码获得我的程序位置:
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL,szPath,MAX_PATH);
并且能够创建密钥:(不确定是否正确)
HKEY newValue;
RegOpenKey(HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Run",&newValue);
RegSetValueEx(newValue,"myprogram",0,REG_SZ,(LPBYTE)szPath,sizeof(szPath));
RegCloseKey(newValue);
return 0;
缺少什么,如果钥匙不在那里,一个小检查…
谢谢!
下面的代码可能满足您的要求。调用RegisterProgram
使您的EXE自注册,以便在用户登录时自动启动。这个函数调用GetModuleFileName
,然后调用另一个名为RegisterMyProgramForStartup
的辅助函数,该辅助函数对注册表进行写入操作。
调用IsMyProgramRegisteredForStartup(L"My_Program")
检测注册是否实际存在并且看起来有效。
一个快速提示。在再次写入键之前检查键是否存在对性能的影响可以忽略不计。您可以盲目地调用RegisterProgram,如果键已经存在,它将覆盖键。检测注册是否存在对于初始化启用或禁用自动启动的UI复选框很有用。(你给你的用户一个选择,对吗?因为我讨厌那些不给我选择就自动安装的程序。
BOOL IsMyProgramRegisteredForStartup(PCWSTR pszAppName)
{
HKEY hKey = NULL;
LONG lResult = 0;
BOOL fSuccess = TRUE;
DWORD dwRegType = REG_SZ;
wchar_t szPathToExe[MAX_PATH] = {};
DWORD dwSize = sizeof(szPathToExe);
lResult = RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Run", 0, KEY_READ, &hKey);
fSuccess = (lResult == 0);
if (fSuccess)
{
lResult = RegGetValueW(hKey, NULL, pszAppName, RRF_RT_REG_SZ, &dwRegType, szPathToExe, &dwSize);
fSuccess = (lResult == 0);
}
if (fSuccess)
{
fSuccess = (wcslen(szPathToExe) > 0) ? TRUE : FALSE;
}
if (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
return fSuccess;
}
BOOL RegisterMyProgramForStartup(PCWSTR pszAppName, PCWSTR pathToExe, PCWSTR args)
{
HKEY hKey = NULL;
LONG lResult = 0;
BOOL fSuccess = TRUE;
DWORD dwSize;
const size_t count = MAX_PATH*2;
wchar_t szValue[count] = {};
wcscpy_s(szValue, count, L""");
wcscat_s(szValue, count, pathToExe);
wcscat_s(szValue, count, L"" ");
if (args != NULL)
{
// caller should make sure "args" is quoted if any single argument has a space
// e.g. (L"-name "Mark Voidale"");
wcscat_s(szValue, count, args);
}
lResult = RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\Microsoft\Windows\CurrentVersion\Run", 0, NULL, 0, (KEY_WRITE | KEY_READ), NULL, &hKey, NULL);
fSuccess = (lResult == 0);
if (fSuccess)
{
dwSize = (wcslen(szValue)+1)*2;
lResult = RegSetValueExW(hKey, pszAppName, 0, REG_SZ, (BYTE*)szValue, dwSize);
fSuccess = (lResult == 0);
}
if (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
return fSuccess;
}
void RegisterProgram()
{
wchar_t szPathToExe[MAX_PATH];
GetModuleFileNameW(NULL, szPathToExe, MAX_PATH);
RegisterMyProgramForStartup(L"My_Program", szPathToExe, L"-foobar");
}
int _tmain(int argc, _TCHAR* argv[])
{
RegisterProgram();
IsMyProgramRegisteredForStartup(L"My_Program");
return 0;
}
检查值是否存在,调用RegQueryValueEx
。
LONG retval = RegQueryValueEx(hKey, "myprogram", NULL, NULL, NULL, NULL);
注意,你所说的newValue
实际上是一个键而不是一个值。为了避免混淆,你应该这样命名。我用了hKey
这个名字
然后根据文档中描述的retval
与ERROR_SUCCESS
进行比较,检查值是否存在。
你的代码的另一个问题是绝对没有错误检查。
忘记写一个关于安全访问的参数
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 检查注册表项是否链接到(或副本)另一个注册表项
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- 注册表正在设置 1 个字符
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 在 c++ 中编辑注册表项
- 某些进程的注册表限制
- 在编译时生成某种子类/类型注册表?
- 如何测试注册表项是否存在?
- 注册表-获取值(而不是键)上次更改的时间和键创建日期
- 从注册表中检索已注销用户的 sid
- 如何正确检查 c++ 是否存在注册表项?
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 强制资源管理器重新加载注册表值
- 重新启动后将删除注册表项
- 如何在注册表中编写内容以在Windows启动时自动重新启动程序
- 如何使用注册表中的CurrentVersionRun键为特定用户自动启动程序
- 将应用程序添加到启动(注册表)
- 在系统启动时从注册表读取文件[c++]