2014-10-04 2 views
0

Я учусь C и пытаюсь сделать приложение, которое изменит Войти фоновый экран для Windows 7.Изменение значений реестра в C

Я знаю, что мне нужно изменить некоторые параметры реестра (инструкции, чтобы сделать это без программирование здесь: 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.

Что я здесь делаю неправильно?

ответ

2

Я предлагаю следующие изменения:

  1. char* number = 0x00000001 не является, как объявить DWORD. Вы хотите DWORD value = 0x00000001. А затем пройдите (BYTE*)&value по номеру RegSetValueEx.
  2. Вы должны проверить возвращаемое значение RegSetValueEx против ERROR_SUCCESS.
  3. Вам нужно добавить манифест в свой исполняемый файл. Это гарантирует, что вы не запустите виртуализацию. И вам также необходимо добавить опцию requireAdministrator, чтобы гарантировать, что процесс будет повышен.
  4. Возможно, вы также обманываете редиректора реестра. Включите флаг KEY_WOW64_64KEY при звонке RegOpenKeyEx по номеру access the 64 bit registry view.

Следующая программа должна сделать трюк:

#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, чтобы обеспечить повышение.

+0

Звучит лучше, чем мой ответ, в любом случае. Особенно это касается 4. В разговоре говорится, что это удалось, поэтому вряд ли будут права/привилегии, 'cos, которые бы вернули' ERROR_ACCESS_DENIED ', (предположительно :). –

+0

@MartinJames Если процесс виртуализирован, то он будет успешным без повышения. Я считаю, что 1, 3 и 4 все –

+0

1. Выполнено 2. ERROR_SUCCESS в соответствии с документами MSDN - это то, что возвращается, если метод является успешным. 3. Что такое манифест? Не могли бы вы подробнее рассказать об этом. 4. Заменяет ли это 'KEY_SET_VALUE «Я поставил оба в использовании. Между ними. Тем не менее, все еще не изменилось. – user2070229

0

'char * number = 0x00000001;' не является целью LPBYTE. Попробуйте номер символа = 1;

+0

Это не исправить, но это хороший момент! – user2070229

+0

OK, но вы указываете REG_DWORD, так как насчет 'DWORD number = 1;' или 'unsigned int number = 1;'? –

+0

.. и, возможно, '(LPDWORD) & number' –

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); 
+0

Как это сделать? Я пробовал запускать его как приложение, то есть не из Visual Studio, но это не имело никакого значения. – user2070229

+0

Если вызов не прошел «разрешения/привилегии», он не должен был возвращать ERROR_SCCESS, который он непринужденно делает :( –

+0

Отредактировал мой ответ. – datOverflow

Смежные вопросы