Tôi đang cố gắng thêm phần mềm của mình vào sổ đăng ký và tôi đã tìm thấy một số đoạn mã mà tôi có thể sử dụng nhưng đây không phải là mã hoạt động hoàn chỉnh đối với tôi và tôi không thể tự tạo mã đó. Nhưng đây là ý tưởng cơ bản: nếu nó chưa được tạo, hãy kiểm tra xem khóa đăng ký đã được đặt chưa.
Tôi có thể lấy vị trí chương trình của mình bằng mã này:
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL,szPath,MAX_PATH);
và đã có thể tạo khóa thông qua: (không chắc đây có phải là cách chính xác không)
HKEY giá trị mới;
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&newValue);
RegSetValueEx(newValue,"myprogram",0,REG_SZ,(LPBYTE)szPath,sizeof(szPath));
RegCloseKey(newValue);
return 0;
Còn thiếu gì, nếu khóa không tồn tại, vui lòng kiểm tra nhỏ...
Cảm ơn!
Đây là một số mã có thể đáp ứng nhu cầu của bạn. Gọi cho EXE của bạn Đăng kýChương trình
để tự đăng ký để nó tự động bắt đầu khi người dùng đăng nhập. Hàm này gọi GetModuleFileName
, và sau đó gọi một cái khác được gọi là Các hàm phụ trợ cho RegisterMyProgramForStartup<
Viết vào sổ đăng ký.
gọi IsMyProgramRegisteredForStartup(L"My_Program")
để phát hiện rằng đăng ký thực sự tồn tại và có vẻ hợp lệ.
Một lưu ý nhanh chóng. Kiểm tra xem khóa có tồn tại hay không trước khi thực sự viết lại nó có tác động không đáng kể đến hiệu suất. Bạn chỉ có thể gọi RegisterProgram một cách mù quáng và nếu khóa đã tồn tại thì nó sẽ ghi đè lên nó. Việc phát hiện sự hiện diện của đăng ký rất hữu ích cho việc khởi tạo các hộp kiểm giao diện người dùng để bật hoặc tắt tính năng tự khởi động. (Bạn đang cho người dùng của mình lựa chọn phải không? Bởi vì tôi ghét các ứng dụng tự động cài đặt và chạy mà không cho tôi lựa chọn.)
BOOL IsMyProgramRegisteredForStartup(PCWSTR pszAppName)
{
HKEY hKey = NULL;
DÀI lKết quả = 0;
BOOL fThành công = 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);
fThành công = (lResult == 0);
nếu(fThành công)
{
lResult = RegGetValueW(hKey, NULL, pszAppName, RRF_RT_REG_SZ, &dwRegType, szPathToExe, &dwSize);
fThành công = (lResult == 0);
}
nếu(fThành công)
{
fThành công = (wcslen(szPathToExe) > 0) ?
}
nếu (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
trả về fThành công;
}
BOOL RegisterMyProgramForStartup(PCWSTR pszAppName, PCWSTR pathToExe, PCWSTR args)
{
HKEY hKey = NULL;
DÀI lKết quả = 0;
BOOL fThành công = 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"\" ");
nếu (args != NULL)
{
// người gọi phải đảm bảo "args" được trích dẫn nếu bất kỳ đối số nào có khoảng trắng
// vd (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);
fThành công = (lResult == 0);
nếu(fThành công)
{
dwSize = (wcslen(szValue)+1)*2;
lResult = RegSetValueExW(hKey, pszAppName, 0, REG_SZ, (BYTE*)szValue, dwSize);
fThành công = (lResult == 0);
}
nếu (hKey != NULL)
{
RegCloseKey(hKey);
hKey = NULL;
}
trả về fThành công;
}
void Đăng kýChương trình()
{
wchar_t szPathToExe[MAX_PATH];
GetModuleFileNameW(NULL, szPathToExe, MAX_PATH);
RegisterMyProgramForStartup(L"My_Program", szPathToExe, L"-foobar");
}
int _tmain(int argc, _TCHAR* argv[])
{
Đăng kýChương trình();
IsMyProgramRegisteredForStartup(L"My_Program");
return 0;
}
Tôi là một lập trình viên xuất sắc, rất giỏi!