none
InternetSetOption设置代理在windows7下失效 RRS feed

  • 问题

  • InternetSetOption可在用注册表改变代理后不用重启IE立即生效。但在WIN7下加了这段后注册表都无法更新了。请问怎么回事?

    去掉最后两行注册表就能更新。XP下正常。

    代码如下:

    using System;
    using System.Collections;
    using System.Threading;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using Microsoft.Win32;
    namespace TestBlog
    {
      class Program
      {
        [DllImport(@"wininet",
        SetLastError = true,
        CharSet = CharSet.Auto,
        EntryPoint = "InternetSetOption",
        CallingConvention = CallingConvention.StdCall)]
        public static extern bool InternetSetOption
        (
        int hInternet,
        int dmOption,
        IntPtr lpBuffer,
        int dwBufferLength
        );
    
        public static void SetProxy(string proxy)
        {
          //打开注册表
          RegistryKey regKey = Registry.CurrentUser;
          string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";
          RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true);
          //更改健值,设置代理,
          optionKey.SetValue("ProxyEnable", 1);
          optionKey.SetValue("ProxyServer", proxy);
          //激活代理设置
          InternetSetOption(0, 39, IntPtr.Zero, 0);
          InternetSetOption(0, 37, IntPtr.Zero, 0);
        }
    
      }
    

    2010年12月4日 16:29

答案

  • 关于: InternetSetOption设置代理在windows7下失效 你的问题答我也碰到了。 我原来希望达到的目的是:运行程序时,设置代理,退出程序时,取消ie代理。 但问题在于,在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。 所以我想了一个办法: 第一次运行时,只设置代理, 然后自动关闭,同时新起一个进行,但传入参数,以表示代理已经设置。 如下: SetProxy("192.168.33.333",true); //设置代理 System.Diagnostics.Process.Start("WindowsApplication1.exe", "参数,已经设置了代理"); //马上启动一个新进程 this.Close();//关闭自己,退出进程。 然后在main函数加个参数判断: static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 form1 = new Form1(); if (args != null && args.Length > 0) { Console.Out.WriteLine(args[0]);//取到参数 form1.Text = "100000";//可以随便处理一下。 } Application.Run(form1); }
    2011年2月14日 13:54

全部回复

  • 可能是InternetSetOption函数出错,你可以Marshal.GetLastWin32Error()方法去获取错误码,参见下面的代码:

                RegistryKey regKey = Registry.CurrentUser;

                string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";

                using (RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true))

                {

                    optionKey.SetValue("ProxyEnable", 1);

                    optionKey.SetValue("ProxyServer", proxy);

                }

     

                bool result = InternetSetOption(0, 39, IntPtr.Zero, 0);

                if (result == false)

                {

                    int errorCode = Marshal.GetLastWin32Error();

                }


    Sincerely,
    Eric
    MSDN Subscriber Support in Forum
    If you have any feedback of our support, please contact msdnmg@microsoft.com.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2010年12月7日 2:12
  • 可能是InternetSetOption函数出错,你可以Marshal.GetLastWin32Error()方法去获取错误码,参见下面的代码:

                RegistryKey regKey = Registry.CurrentUser;

                string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";

                using (RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true))

                {

                    optionKey.SetValue("ProxyEnable", 1);

                    optionKey.SetValue("ProxyServer", proxy);

                }

     

                bool result = InternetSetOption(0, 39, IntPtr.Zero, 0);

                if (result == false)

                {

                    int errorCode = Marshal.GetLastWin32Error();

                }


    Sincerely,
    Eric
    MSDN Subscriber Support in Forum
    If you have any feedback of our support, please contact msdnmg@microsoft.com.
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    测试结果result=true,但是IE代理没改掉,注册表里的值也没变。
    2010年12月10日 2:53
  • 或许可以试试这样:

    RegistryKey regKey = Registry.CurrentUser;

    string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";

    using(RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true))

    {

        //更改健值,设置代理,

        optionKey.SetValue("ProxyEnable", 1);

        optionKey.SetValue("ProxyServer", proxy);

    }

    //激活代理设置 InternetSetOption(0, 39, IntPtr.Zero, 0);

    InternetSetOption(0, 37, IntPtr.Zero, 0);

    注册表句柄关闭前调用InternetSetOption或许造成了访问冲突

    2010年12月10日 5:36
  • 或许可以试试这样:

    RegistryKey regKey = Registry.CurrentUser;

    string SubKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Internet Settings";

    using(RegistryKey optionKey = regKey.OpenSubKey(SubKeyPath, true))

    {

        //更改健值,设置代理,

        optionKey.SetValue("ProxyEnable", 1);

        optionKey.SetValue("ProxyServer", proxy);

    }

    //激活代理设置 InternetSetOption(0, 39, IntPtr.Zero, 0);

    InternetSetOption(0, 37, IntPtr.Zero, 0);

    注册表句柄关闭前调用InternetSetOption或许造成了访问冲突


    一样滴效果!
    2010年12月10日 12:59
  • 关于: InternetSetOption设置代理在windows7下失效 你的问题答我也碰到了。 我原来希望达到的目的是:运行程序时,设置代理,退出程序时,取消ie代理。 但问题在于,在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。 所以我想了一个办法: 第一次运行时,只设置代理, 然后自动关闭,同时新起一个进行,但传入参数,以表示代理已经设置。 如下: SetProxy("192.168.33.333",true); //设置代理 System.Diagnostics.Process.Start("WindowsApplication1.exe", "参数,已经设置了代理"); //马上启动一个新进程 this.Close();//关闭自己,退出进程。 然后在main函数加个参数判断: static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 form1 = new Form1(); if (args != null && args.Length > 0) { Console.Out.WriteLine(args[0]);//取到参数 form1.Text = "100000";//可以随便处理一下。 } Application.Run(form1); }
    2011年2月14日 13:54
  • 关于: InternetSetOption设置代理在windows7下失效 你的问题答我也碰到了。 我原来希望达到的目的是:运行程序时,设置代理,退出程序时,取消ie代理。 但问题在于,在window7下, 在一个进程中, 设置和取消不能都执行,---- 要么设置,要么取消。 但如果第一次运行时,只进行设置代理,退出后再进运行,只进行取消,这是没有问题的。 所以我想了一个办法: 第一次运行时,只设置代理, 然后自动关闭,同时新起一个进行,但传入参数,以表示代理已经设置。 如下: SetProxy("192.168.33.333",true); //设置代理 System.Diagnostics.Process.Start("WindowsApplication1.exe", "参数,已经设置了代理"); //马上启动一个新进程 this.Close();//关闭自己,退出进程。 然后在main函数加个参数判断: static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Form1 form1 = new Form1(); if (args != null && args.Length > 0) { Console.Out.WriteLine(args[0]);//取到参数 form1.Text = "100000";//可以随便处理一下。 } Application.Run(form1); }


    既然如此 不如建立一个 exe文件  

    setProxy.exe /enable:192...:8080

    setProxy.exe /disable

    然后主程序调用?


    入了ipad,最近用ipad上论坛
    2011年3月10日 13:48
    版主