Набор значений реестра Proxy работает только 1 раз - PullRequest
0 голосов
/ 18 декабря 2018

Таким образом, этот код уже работает для настройки My Proxy Pac, но проблема в том, что RegKey.SetValue ("AutoConfigURL") или RegKey.DeleteValue ("AutoConfigURL") работают только 1 раз.

Так что мне нужно повторно запустить мои приложения для удаления или установки заново.Даже я использую закрытие формы, если я устанавливаю значение SetValue или сначала что-то делаю с кнопкой.Во второй раз это не сработает.

Есть ли что-то, что я пропустил?

    [DllImport("wininet.dll")]
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength);
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39;
    public const int INTERNET_OPTION_REFRESH = 37;
    bool settingsReturn, refreshReturn;

    public VPNForm()
    {
        InitializeComponent();
        ConnectionChecker();
    }

    //When Button Click On or Off By Button Text
    private void VPNButton_Click(object sender, EventArgs e)
    {
        RegistryKey RegKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", RegistryKeyPermissionCheck.ReadWriteSubTree);
        if (VPNButton.Text == "ON")
        {
            RegKey.SetValue("AutoConfigURL", "mypaclink/proxy.pac");
            settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
            refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
        }
        else
        {
            if(RegKey.GetValue("AutoConfigURL") != null)
            {
                RegKey.DeleteValue("AutoConfigURL");
            }
            settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
            refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
        }
        RegKey.Close();
        ConnectionChecker();
    }
    //Delete Proxy Setting
    private void VPNForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        RegistryKey RegKey2 = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        if (RegKey2.GetValue("AutoConfigURL") != null)
        {
            RegKey2.DeleteValue("AutoConfigURL");
        }
        settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
        refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
        RegKey2.Close();
    }
    //Check Condition Proxy is ON or OFF
    public void ConnectionChecker()
    {
        RegistryKey RegKey3 = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
        if (RegKey3.GetValue("AutoConfigURL") == null)
        {
            VPNButton.Text = "ON";
            ConnectionLabel.Text = "Disconnected";
        }
        else
        {
            VPNButton.Text = "OFF";
            ConnectionLabel.Text = "Connected";
        }
        RegKey3.Close();
    }

Edit # 1:

Так что я нахожу проблему не внутри моего кода, а в моем собственном ПК, только у меня с 5 ПК.Не знаю почему, сейчас я пытаюсь обновить его с Windows 7 до Windows 10. Если кто-нибудь знает, как найти проблему, скажите, пожалуйста, спасибо.Я использую 4 ПК с Windows 7 и 1 Windows 10 Все работает отлично ..

1 Ответ

0 голосов
/ 18 декабря 2018

Хотя в комментариях вы упоминаете, что он работает на других ПК, для меня логика в следующем коде кажется обратной:

if (RegKey3.GetValue("AutoConfigURL") == null)
{
    VPNButton.Text = "ON";
     ConnectionLabel.Text = "Disconnected";
}
else
{
    VPNButton.Text = "OFF";
    ConnectionLabel.Text = "Connected";
}

Разве это не должно быть:

if (RegKey3.GetValue("AutoConfigURL") != null) // Reversed the check here
{
    VPNButton.Text = "ON";
    ConnectionLabel.Text = "Disconnected";
}
else
{
    VPNButton.Text = "OFF";
    ConnectionLabel.Text = "Connected";
}

Надеюсь, это поможет!

...