在C中更改注册表值

时间:2014-10-04 16:00:03

标签: c windows visual-studio registry

我正在学习C并尝试创建一个可以更改Windows 7登录背景屏幕的应用程序。

我知道我需要更改一些注册表值(在没有编程的情况下执行此操作的说明:http://helpdeskgeek.com/windows-7/change-the-windows-7-login-screen-background-image/

所以我知道为了更改注册表中的值,我需要创建一个打开值的句柄,然后更改它。

这是我到目前为止所做的:

char* number = 0x00000001; 
HKEY key;

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"), 0, KEY_SET_VALUE, &key) == ERROR_SUCCESS){
    printf("Key location open successful \n");


    if (RegSetValueEx(key, "OEMBackground", 0, REG_DWORD, (LPBYTE)&number, sizeof(DWORD))){
        printf("Key not changed in registry \n");
        printf("Error %d ", GetLastError());
    }

    else{
        printf("Key changed in registry \n");
    }

    RegCloseKey(key);

}

else {
    printf("Unsuccessful in opening key  \n");
    printf("Cannot find key value in registry \n");
    printf("Error: %d ", GetLastError());
}

结果我说密钥已打开,并且值已更改。但价值没有改变。

注册表中的值当前为0.我想将其更改为1.

我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

我建议进行以下更改:

  1. char* number = 0x00000001不是如何声明DWORD。你想要DWORD value = 0x00000001。然后将(BYTE*)&value传递给RegSetValueEx
  2. 您应该检查RegSetValueExERROR_SUCCESS的返回值。
  3. 您需要向可执行文件添加清单。这将确保您不会运行虚拟化。您还需要添加requireAdministrator选项以确保进程升级。
  4. 您可能也被注册表重定向器欺骗了。在致电KEY_WOW64_64KEYaccess the 64 bit registry view时,请附上RegOpenKeyEx标志。
  5. 以下程序应该可以解决问题:

    #include <stdio.h>
    #include <windows.h>
    
    int main(void)
    {
        DWORD number = 0x00000001; 
        HKEY key;
    
        if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background", 0, KEY_SET_VALUE | KEY_WOW64_64KEY, &key) == ERROR_SUCCESS)
        {
            printf("Key location open successful \n");
            if (RegSetValueExW(key, L"OEMBackground", 0, REG_DWORD, (LPBYTE)&number, sizeof(DWORD)) == ERROR_SUCCESS)
            {
                printf("Key changed in registry \n");
            }
            else{
                printf("Key not changed in registry \n");
                printf("Error %u ", (unsigned int)GetLastError());
            }
            RegCloseKey(key);
        }
        else 
        {
            printf("Unsuccessful in opening key  \n");
            printf("Cannot find key value in registry \n");
            printf("Error: %u ", (unsigned int)GetLastError());
        }
    
        return 0;
    }
    

    确保使用requireAdministrator将正确的应用程序清单链接到程序,以确保提升。

答案 1 :(得分:0)

'char * number = 0x00000001;'不是LPBYTE的目标。尝试char number = 1;

答案 2 :(得分:0)

尝试使用管理员权限运行应用程序,而不是直接调试。

我自己使用此代码编辑注册表:

HKEY hkey;
DWORD disp;
BYTE *b[0x1];
b[0] = 1;
RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, &hkey);
RegSetValueEx(hkey, L"RPEnabled", 0, REG_BINARY, b, 0x1);