Почему Windows не распознает, что мое приложение C ++ изменило раздел реестра, даже если реестр и пользовательский интерфейс показывают обновление? - PullRequest
0 голосов
/ 04 июня 2018

Я написал небольшое консольное приложение C ++ для установки раздела реестра Windows.В частности, я меняю флажок «Использовать прокси-сервер для вашей локальной сети» в диалоговом окне «Свойства обозревателя», показанном ниже:

Proxy dialog

Вот кодчто я использую, чтобы установить этот ключ.Я могу подтвердить, что ключ реестра обновляется успешно, и я могу подтвердить, что флажок диалогового окна также отражает эти изменения.Однако проблема, с которой я сталкиваюсь, заключается в том, что эффект на самом деле не происходит в операционной системе.

const DWORD ENABLED_VALUE = 1;
const DWORD DISABLED_VALUE = 0;
const LPCWSTR REGISTRY_KEY_LOCATION = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
const LPCWSTR REGISTRY_KEY_NAME = TEXT("ProxyEnable");

PHKEY OpenRegistryKey(PHKEY key) {
    LONG err = RegOpenKey(HKEY_CURRENT_USER, REGISTRY_KEY_LOCATION, key);
    if (err != ERROR_SUCCESS) {
        cout << "Unable to open registry key.\n";
    }
    return key;
}

void SetProxy(DWORD value) {
    HKEY key;
    OpenRegistryKey(&key);
    LONG err = RegSetValueEx(key, REGISTRY_KEY_NAME, 0, REG_DWORD, (const BYTE*)&value, sizeof(value));
    if (err != ERROR_SUCCESS) {
        cout << "Unable to set registry value ProxyEnable.\n";
        cout << err;
    }
    RegCloseKey(key);
}

Поэтому, если я использую приведенный выше код для включения прокси-сервера, прокси-сервер все еще не включен, несмотря на проверку обновления как в реестре, так и в диалоговом окне.Однако, если я просто открою диалоговое окно на изображении выше, убедитесь, что флажок изменился, а затем просто нажмите «ОК», изменение вступит в силу и изменится статус прокси.

Проверка, действительно ли прокси включенлегко, так как я делаю всю свою работу по VPN: если прокси действительно включен, я могу просматривать Интернет.Если он отключен, каждая попытка попасть по URL-адресу в браузере прерывается или выдает ошибку.

Итак, мне кажется, что мне не хватает какого-то шага «подтвердить изменение», когда изменение распространяетсяво всей среде Windows.Я пытался использовать RegFlushKey после обновления реестра, но это ничего не изменило.Как я могу получить обновления реестра для Windows?

1 Ответ

0 голосов
/ 05 июня 2018

Я нашел решение, которое искал.Было правильно, что мне нужно было «подтвердить» изменения в системе, и в C ++ вы делаете это с помощью метода InternetSetOption .После каждого обновления реестра вы должны убедиться, что выполнены следующие две строки:

InternetSetOption(NULL, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0);

Это уведомляет Windows о внесении вами изменений в Свойства обозревателя, и она должна подобрать эти изменения и действовать соответственно.

Итак, для ссылки на код, который я разместил в своем вопросе, я сделал следующее обновление:

void SetProxy(DWORD value) {
    HKEY key;
    OpenRegistryKey(&key);
    LONG err = RegSetValueEx(key, REGISTRY_KEY_NAME, 0, REG_DWORD, (const BYTE*)&value, sizeof(value));
    if (err != ERROR_SUCCESS) {
        cout << "Unable to set registry value ProxyEnable.\n";
        cout << err;
    }
    RegCloseKey(key);

    InternetSetOption(NULL, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH, NULL, 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...