gpt4 book ai didi

c++ - 将应用程序添加到启动(注册表)

转载 作者:可可西里 更新时间:2023-11-01 13:50:37 29 4
gpt4 key购买 nike

我正在尝试将我的软件添加到注册表中,我找到了一些我可以使用的代码片段,但不是完整的工作代码 C/C++ 对我来说是新的,我无法自己创建它。但这里是基本的想法:如果没有创建它,请检查是否设置了注册键。

我能够使用这段代码获取我的程序位置:

TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL,szPath,MAX_PATH);

并且能够通过以下方式创建 key :(不确定这是否是正确的方法)

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;

缺少什么,如果 key 不存在,请进行小检查...

谢谢!

最佳答案

这里有一些代码可能会满足您的需求。为您的 EXE 调用 RegisterProgram 以自行注册,以便在用户登录时自动启动。此函数调用 GetModuleFileName,然后调用另一个名为 RegisterMyProgramForStartup< 的辅助函数 写入注册表。

调用 IsMyProgramRegisteredForStartup(L"My_Program") 来检测注册是否确实存在并且看起来有效。

一个简短的笔记。在实际再次写出之前检查 key 是否存在对性能的影响可以忽略不计。您可以只盲目地调用 RegisterProgram,如果 key 已经存在,它将覆盖它。检测注册是否存在对于初始化启用或禁用自动启动的 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;
}

关于c++ - 将应用程序添加到启动(注册表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15913202/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com