添加应用程序启动(registry)

我试图把我的软件添加到registry,我发现了一些我可以使用的代码,但不是完整的工作代码C / C ++对我来说是新的,不能自己创build。 但这里有一个基本的想法:检查是否注册密钥集,如果没有创build它。

我能够使用这个代码得到我的程序位置:

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

并能够创build密钥:(不知道是否是正确的方法)

 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; 

什么是缺less的,一个小的检查,如果钥匙不在那里…

谢谢!

这里有一些代码可能做你想要的。 为您的EXE调用RegisterProgram自注册自己以便在用户登录时自动启动。此函数调用GetmoduleeFileName ,然后调用另一个名为RegisterMyProgramForStartup帮助函数,它执行向注册表的写操作。

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

一个简短的说明。 在再次写出密钥之前检查密钥是否存在的性能影响可以忽略不计。 您可以盲目地调用RegisterProgram,如果它已经存在,它将覆盖该键。 检测注册是否有用于初始化您的用户界面复选框,启用或禁用自动启动。 (你给用户一个选择,对吧?因为我讨厌自动安装自动运行的应用程序而没有给我一个选择。)

 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 // eg (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]; GetmoduleeFileNameW(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这个名字。

然后检查是否存在该值,如文档中所述比较retvalERROR_SUCCESS

你的代码的另一个问题是绝对没有错误检查。 我会留给你解决。