在C中更改注册表值

用户名

我正在学习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。

我在这里做错了什么?

戴维·赫弗南

我建议进行以下更改:

  1. char* number = 0x00000001不是如何声明一个DWORD你要DWORD value = 0x00000001然后传递(BYTE*)&valueRegSetValueEx
  2. 您应该检查返回值RegSetValueExERROR_SUCCESS
  3. 您需要将清单添加到可执行文件中。这将确保您不运行虚拟化。而且,您还需要添加requireAdministrator选项以确保过程得到提升。
  4. 您可能还会被注册表重定向器欺骗。KEY_WOW64_64KEY调用RegOpenKeyEx访问64位注册表视图时,请包括该标志

以下程序可以解决问题:

#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以确保高程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何删除注册表中的多个值

来自分类Dev

JS:读取JavaScript中的注册表值

来自分类Dev

更改注册表中当前用户以外的用户设置

来自分类Dev

如何在Qt中添加/更改注册表?

来自分类Dev

在Powershell中为注册表值编辑MultiString数组

来自分类Dev

如何在IntelliJ注册表中设置值?

来自分类Dev

遍历注册表并获取所有子项和C#中RegistryKey中的值

来自分类Dev

C ++-从注册表读取值中获取空值

来自分类Dev

更改gradle节点插件中的注册表URL

来自分类Dev

使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

来自分类Dev

在注册表中搜索多个值

来自分类Dev

注册表删除值

来自分类Dev

设置注册表值

来自分类Dev

在注册表子项中搜索值

来自分类Dev

注册表值访问

来自分类Dev

试图在注册表中创建一个值-C ++-RegSetValueEx

来自分类Dev

使用Ruby / JRuby更改注册表值

来自分类Dev

如何在Qt中添加/更改注册表?

来自分类Dev

如何批量更改注册表值

来自分类Dev

通过Windows注册表更改Windows中的声音方案

来自分类Dev

在批处理脚本中更改注册表值后,如何强制更新为代理设置?

来自分类Dev

使用C#测试注册表中是否存在DWORD值

来自分类Dev

更改gradle节点插件中的注册表URL

来自分类Dev

使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

来自分类Dev

Shutdown.exe-更改注册表中的路径

来自分类Dev

在C#中删除单个注册表值

来自分类Dev

在注册表中更改主页后的IE 11警告

来自分类Dev

无法删除注册表中的值

来自分类Dev

您如何使用 powershell 跟踪注册表中的更改?

Related 相关文章

热门标签

归档