public static bool GetProxyEnabled() { InternetPerConnOptionList request = new InternetPerConnOptionList(); InternetPerConnOption[] options = new InternetPerConnOption[1]; IntPtr optionsPtr = IntPtr.Zero; try { options[0].dwOption = OptionType.INTERNET_PER_CONN_FLAGS; request.dwSize = Marshal.SizeOf(typeof(InternetPerConnOptionList)); request.pszConnection = IntPtr.Zero; request.dwOptionCount = options.Length; request.dwOptionError = 0; int optionSize = Marshal.SizeOf(options[0]); optionsPtr = Marshal.AllocCoTaskMem(optionSize * options.Length); if (optionsPtr == IntPtr.Zero) { return(false); } for (int i = 0; i < options.Length; i++) { IntPtr optionPtr = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); Marshal.StructureToPtr(options[i], optionPtr, false); } request.pOptions = optionsPtr; int requestLength = request.dwSize; bool result = NativeMethods.InternetQueryOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_PER_CONNECTION_OPTION, ref request, ref requestLength); if (!result) { throw new Win32Exception(Marshal.GetLastWin32Error()); } else { for (int i = 0; i < options.Length; i++) { IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); options[i] = (InternetPerConnOption)Marshal.PtrToStructure(opt, typeof(InternetPerConnOption)); } return(((ProxyFlags)options[0].Value.dwValue & ProxyFlags.PROXY_TYPE_PROXY) == ProxyFlags.PROXY_TYPE_PROXY); } } finally { if (optionsPtr == IntPtr.Zero) { Marshal.FreeCoTaskMem(optionsPtr); } } }
public static bool UnsetProxy() { InternetPerConnOptionList request = new InternetPerConnOptionList(); InternetPerConnOption[] options = new InternetPerConnOption[3]; int optionSize = 0; IntPtr optionsPtr = IntPtr.Zero; try { options[0].dwOption = OptionType.INTERNET_PER_CONN_FLAGS; options[0].Value.dwValue = (int)ProxyFlags.PROXY_TYPE_DIRECT; options[1].dwOption = OptionType.INTERNET_PER_CONN_PROXY_SERVER; options[1].Value.szValue = IntPtr.Zero; options[2].dwOption = OptionType.INTERNET_PER_CONN_PROXY_BYPASS; options[2].Value.szValue = IntPtr.Zero; optionSize = Marshal.SizeOf(typeof(InternetPerConnOption)); optionsPtr = Marshal.AllocCoTaskMem(optionSize * options.Length); if (optionsPtr == IntPtr.Zero) { return(false); } for (int i = 0; i < options.Length; ++i) { IntPtr optionPtr = new IntPtr(optionsPtr.ToInt32() + (i * optionSize)); Marshal.StructureToPtr(options[i], optionPtr, false); } request.pszConnection = IntPtr.Zero; request.dwSize = Marshal.SizeOf(typeof(InternetPerConnOptionList)); request.dwOptionCount = options.Length; request.dwOptionError = 0; request.pOptions = optionsPtr; int requestLength = request.dwSize; if (NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_PER_CONNECTION_OPTION, ref request, requestLength)) { NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0); NativeMethods.InternetSetOption(IntPtr.Zero, InternetOptionActions.INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); return(true); } else { return(false); } } finally { if (optionsPtr != IntPtr.Zero) { Marshal.FreeCoTaskMem(optionsPtr); } for (int i = 1; i < options.Length; i++) { if (options[i].Value.szValue != IntPtr.Zero) { Marshal.FreeHGlobal(options[i].Value.szValue); } } } }
public static void Disable() { InternetPerConnOption[] options = new InternetPerConnOption[1]; options[0] = new InternetPerConnOption(); options[0].dwOption = 1; options[0].Value.dwValue = 1; InternetSetOption(options); }
public static void Enable(string proxy) { InternetPerConnOption[] options = new InternetPerConnOption[2]; options[0] = new InternetPerConnOption(); options[0].dwOption = 1; options[0].Value.dwValue = 2; options[1] = new InternetPerConnOption(); options[1].dwOption = 2; options[1].Value.pszValue = Marshal.StringToHGlobalAnsi(proxy); InternetSetOption(options); }
public static bool SetProxy(string strProxy, string exceptions) { InternetPerConnOptionList list = new InternetPerConnOptionList(); int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3); InternetPerConnOption[] options = new InternetPerConnOption[optionCount]; //not use or use proxy server options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY)); //proxy server if (optionCount > 1) { options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER; options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy); //except for these addresses ... if (optionCount > 2) { options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS; options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions); } } // default stuff list.dwSize = Marshal.SizeOf(list); list.pszConnection = IntPtr.Zero; list.dwOptionCount = options.Length; list.dwOptionError = 0; int optSize = Marshal.SizeOf(typeof(InternetPerConnOption)); // make a pointer out of all that ... IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length); // copy the array over into that spot in memory ... for (int j = 0; j < options.Length; ++j) { IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (j * optSize)); Marshal.StructureToPtr(options[j], opt, false); } list.pOptions = optionsPtr; // and then make a pointer out of the whole list IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize); Marshal.StructureToPtr(list, ipcoListPtr, false); // and finally, call the API method! int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, ipcoListPtr, list.dwSize) ? -1 : 0; if (returnvalue == 0) { // get the error codes, they might be helpful returnvalue = Marshal.GetLastWin32Error(); } // FREE the data ASAP Marshal.FreeCoTaskMem(optionsPtr); Marshal.FreeCoTaskMem(ipcoListPtr); if (returnvalue > 0) { // throw the error codes, they might be helpful throw new Win32Exception(Marshal.GetLastWin32Error()); } return(returnvalue < 0); }