2016-05-02 1 views
-6

Так что я пытаюсь написать небольшое приложение, которое изменяет строку в реестре, чтобы включить определенную вещь ..Необъяснимой ошибка в моем коде

Вот мой код.

#include <iostream> 
#include <Windows.h> 

DWORD transparenton = 0x00000001; 
DWORD transparentoff = 0x00000000; 

using namespace std; 

void pause(); 
void act(PHKEY key); 
void enableTransparency(); 
void disableTransparency(); 


int main() 
{ 
    cout << "\tStart Menu Blurrier\n"; 
    cout << "Make your Windows 10 start menu background blurry like in Windows 7\nAutomatic On/Off\n"; 
    pause(); 
    PHKEY result; 
    RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\EnableBlurBehind", result); 
    act(result); 
    //enableTransparency(); 
    RegCloseKey(HKEY_CURRENT_USER); 
    pause(); 
} 

void pause() 
{ 
    cout << "Press [ENTER] to continue..."; 
    cin.get(); 
    system("cls"); 
} 

void act(PHKEY key) 
{ 
    DWORD l = (DWORD)key; 
    if(l==transparenton){ 
     disableTransparency(); 
    } 
    else{ 
     enableTransparency(); 
    } 
} 

void disableTransparency() 
{ 
    RegSetKeyValueA(HKEY_CURRENT_USER, 
     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\", 
     "EnableBlurBehind", 
     REG_DWORD, 
     &transparentoff, 
     sizeof(transparentoff)); 
} 

void enableTransparency() 
{ 
    RegSetKeyValueA(HKEY_CURRENT_USER, 
     "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize\\", 
     "EnableBlurBehind", 
     REG_DWORD, 
     &transparenton, 
     sizeof(transparenton)); 
} 

Хорошо, ошибка в недействительном акте

void act(PHKEY key) 
{ 
    DWORD l = (DWORD)key; 
    if(l==transparenton){ 
     disableTransparency(); 
    } 
    else{ 
     enableTransparency(); 
    } 
} 

Он может обнаружить, когда он на и выключить его, но он не может определить, когда он выключен и включите его.

1) Функция enableTransparency работает нормально, потому что, если я вызываю ее напрямую, она работает. 2) Я также попробовал два отдельных варианта (один для включения и другой для офф) без каких-либо результатов! также попытался равным NULL вместо прозрачности или использования else. Ничего не работает.

Что, черт возьми, эти C++ - только ошибки, которые кажутся мне время от времени.

+3

Почему вы думаете, литье 'PHKEY' для типа DWORD и сравнивая его с константой имеет смысл? И почему вы передаете неинициализированный указатель на 'RegOpenKeyA'? – CodesInChaos

+0

Передача унифицированного указателя была единственным способом, так как для этого требовался LPCVOID, который является указателем на что-то? Поправьте меня, если я ошибаюсь ... Если тогда, как я должен это делать? – MW2TopTenWORLD

+1

Я думаю, вам нужна локальная переменная типа 'HKEY', и вы передаете указатель на нее в' RegOpenKeyA'. Это даст вам ручку. Но, конечно, сравнение дескриптора с константой все еще бессмысленно. – CodesInChaos

ответ

4

Существует несколько проблем с вашим кодом (использование устаревших API, использование плохих параметров, отсутствие логики и т. Д.).

Попробуйте что-то больше, как это вместо:

#include <iostream> 
#include <Windows.h> 

const DWORD transparenton = 0x00000001; 
const DWORD transparentoff = 0x00000000; 

using namespace std; 

void pause(); 
void act(HKEY key); 
bool getTransparency(HKEY key, DWORD &value); 
void setTransparency(HKEY key, DWORD value); 

int main() 
{ 
    cout << "\tStart Menu Blurrier\n"; 
    cout << "Make your Windows 10 start menu background blurry like in Windows 7\nAutomatic On/Off\n"; 
    pause(); 

    HKEY hKey; 
    LONG result = RegOpenKeyExW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey); 
    if (result == 0) 
    { 
     act(hKey); 
     RegCloseKey(hKey); 
    } 
    return 0; 
} 

void pause() 
{ 
    cout << "Press [ENTER] to continue..."; 
    cin.get(); 
    system("cls"); 
} 

void act(HKEY key) 
{ 
    DWORD value; 
    if (getTransparency(key, value)) 
    { 
     if (value == transparenton) { 
      setTransparency(key, transparentoff); 
     } 
     else { 
      setTransparency(key, transparenton); 
     } 
    } 
} 

bool getTransparency(HKEY key, DWORD &value) 
{ 
    DWORD size = sizeof(value); 
    LONG result = RegQueryValueExW(key, L"EnableBlurBehind", NULL, NULL, (BYTE*)&value, &size); 
    if (result == ERROR_FILE_NOT_FOUND) 
    { 
     value = transparentoff; 
     result = 0; 
    } 
    return (result == 0); 
} 

void setTransparency(HKEY key, DWORD value) 
{ 
    RegSetValueExW(key, L"EnableBlurBehind", 0, REG_DWORD, (BYTE*)&value, sizeof(value)); 
} 
+0

Большое спасибо, и я не буду просто копировать код, который я действительно изучаю и узнаю:) – MW2TopTenWORLD

+1

@ MW2TopTenWORLD: Способ сказать * «Спасибо!» * На stackoverflow - это голосование по ответам (и вопросам), как только у вас будет достаточно репутации. Вы можете получить начальную репутацию бесплатно. См. [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) для информации. – IInspectable