请教wininet.dll中的InternetSetOption函数的小问题
我的目标是通过C#代码设置和取消网络代理。
从网上找了段代码,写一个小程序来测试一下,点击form上的一个按钮设置代理,一个按钮取消代理,代码如下
按钮的事件中除了修改注册表以外还调用了,wininet.dll中的InternetSetOption,用于即使IE没有关闭也能更新当前打开的IE中的代理设置。
但是现在遇到的问题是,启动这个程序,第一下乌云是点击设置代理还是取消代理都正确,但是在不关闭这个程序的情况下,再去点击另外一个按钮,代理没有改变。Debug之后发现,是由于InternetSetOption这个函数导致的,假设我先点击设置代理的按钮,注册表修改成功,当前打开的IE代理设置修改也成功,但是再点击取消代理时,未执行InternetSetOption函数时修改注册表成功,再执行InternetSetOption函数又把注册表修改会设置代理的值了。
也就是会所当程序在同一次运行状态中,调用InternetSetOption刷新只会按照第一次修改注册表的值进行刷新。
请教各位大牛,有没有了解InternetSetOption这个函数的,或者遇到过这样的问题,有什么好方法可以解决这个问题
全部代码都在这,有兴趣的可以试试,是不是跟我一个现象。我的电脑是Win7 + vs2010 sp1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
#region 用于刷新IE代理设置
[DllImport("wininet.dll", SetLastError = true)]
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lPBuffer, int lpdwBufferLength);
private const int INTERNET_OPTION_REFRESH = 0x000025;
private const int INTERNET_OPTION_SETTINGS_CHANGED = 0x000027;
#endregion
//设置代理
private void enableProxyButton_Click(object sender, EventArgs e)
{
//设置注册表相应键值
RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
key.SetValue("ProxyOverride", "10.2.1.*;<local>");
key.SetValue("ProxyServer", "proxy.com:8080");
key.SetValue("ProxyEnable", 1);
key.Close();
//刷新
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
//取消代理
private void disableProxyButton_Click(object sender, EventArgs e)
{
//设置注册表相应键值
RegistryKey key = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true);
key.SetValue("ProxyEnable", 0);
key.Close();
//刷新
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0);
}
}