我正在学习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.
我在这里做错了什么?
答案 0 :(得分:2)
我建议进行以下更改:
char* number = 0x00000001
不是如何声明DWORD
。你想要DWORD value = 0x00000001
。然后将(BYTE*)&value
传递给RegSetValueEx
。RegSetValueEx
对ERROR_SUCCESS
的返回值。requireAdministrator
选项以确保进程升级。KEY_WOW64_64KEY
至access the 64 bit registry view时,请附上RegOpenKeyEx
标志。以下程序应该可以解决问题:
#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);