我试图启用/禁用Windows全局代理(在Internet选项)使用Windowsregistry。 如果我设置的值,我没有任何问题,但刷新设置。 search后,我发现了一个问题,提供了代码。 但现在的问题是,在应用程序的每个会话中,它只工作一次。 即它第一次工作,如果你想再次工作,你必须重新运行应用程序。 任何想法可能是什么问题? 这是代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Microsoft.Win32; using System.Runtime.InteropServices; namespace SystemProxyToggle { public partial class Form1 : Form { [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; static bool settingsReturn, refreshReturn; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { queryStatus(); } private void btnToggle_Click(object sender, EventArgs e) { toggleStatus(); queryStatus(); } private void queryStatus() { RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); int status = (int)registry.GetValue("ProxyEnable"); if (status == 0) { lblStatus.Text = "Proxy Is Disabled"; lblStatus.ForeColor = Color.Maroon; } else { lblStatus.Text = "Proxy Is Enabled"; lblStatus.ForeColor = Color.Green; } //I added this after I encountered the problem //though I don't that this is the problem registry.Close(); } private void toggleStatus() { RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); int status = (int)registry.GetValue("ProxyEnable"); if (status == 1) { registry.SetValue("ProxyEnable", 0); } else { registry.SetValue("ProxyEnable", 1); } //Refresh System Settings settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); //I added this after I encountered the problem registry.Close(); } } }
对于在这个问题上陷入困境的其他人来说,奇怪的东西似乎对我有用。
我只是删除/评论所有对InternetSetOption()的调用
//settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); //refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
重新启动程序,这一次,注册表更改在两个方向上生效,只要我想,而不是第一次。
我已经在Windows 7(Internet Explorer 11)中测试了这个代码,并且没有任何问题,但是当我在Windows 8的第二个系统中尝试时,我的结果和你一样。
挖了一段时间后,我发现你应该以不同的方式调用InternetSetOption
,基本上是这样的:
INTERNET_OPTION_PROXY_SETTINGS_CHANGED = 95 InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0);
我在两个系统上再次尝试,它工作得很好。
干杯