MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Установить прокси для модема на C# (через реестр)"
Answer 749931
Можно использовать функцию InternetSetOption с параметром
INTERNET_OPTION_PER_CONNECTION_OPTION
. Для получения необходимого результата нужно установить две опции:INTERNET_PER_CONN_PROXY_SERVER
- имя прокси-сервера иINTERNET_PER_CONN_FLAGS
- флаг, указывающий на использование явно заданного прокси-сервера. Затем нужно обновить настройки IE с помощью вызоваInternetSetOption
с параметромINTERNET_OPTION_REFRESH
.using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace InternetTest { public class Internet { public const uint INTERNET_OPTION_PER_CONNECTION_OPTION = 75; public const uint INTERNET_OPTION_REFRESH = 37; public const uint INTERNET_PER_CONN_FLAGS = 1; public const uint INTERNET_PER_CONN_PROXY_SERVER = 2; public const uint PROXY_TYPE_PROXY = 0x00000002; [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool InternetSetOption(IntPtr hInternet, uint dwOption, IntPtr lpBuffer, int dwBufferLength); /*Установка значения прокси-сервера strProxy для подключения strCon*/ public static bool SetProxy(string strCon,string strProxy) { InternetPerConnOptionList optlist = new InternetPerConnOptionList(); IntPtr pstruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(optlist)); INTERNET_PER_CONN_OPTION opt = new INTERNET_PER_CONN_OPTION(); bool res; try { // proxy server optlist.dwSize = Marshal.SizeOf(typeof(InternetPerConnOptionList)); optlist.szConnection = Marshal.StringToHGlobalUni(strCon); optlist.dwOptionCount = 1; optlist.options = Marshal.AllocCoTaskMem(Marshal.SizeOf(opt)); opt.dwOption = INTERNET_PER_CONN_PROXY_SERVER; opt.Value = Marshal.StringToHGlobalUni(strProxy); Marshal.StructureToPtr(opt, optlist.options, true); Marshal.StructureToPtr(optlist, pstruct, true); res = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PER_CONNECTION_OPTION, pstruct, Marshal.SizeOf(optlist)); if (res == false) System.Diagnostics.Debug.WriteLine("Failed to set proxy server"); //flags INTERNET_PER_CONN_OPTION2 opt2 = new INTERNET_PER_CONN_OPTION2(); opt2.dwOption = INTERNET_PER_CONN_FLAGS; opt2.Value = PROXY_TYPE_PROXY; Marshal.StructureToPtr(opt2, optlist.options, true); res = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PER_CONNECTION_OPTION, pstruct, Marshal.SizeOf(optlist)); if (res == false) System.Diagnostics.Debug.WriteLine("Failed to set flags"); //refresh res = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); if (res == false) System.Diagnostics.Debug.WriteLine("Failed to refresh IE settings"); } finally { if (opt.Value != IntPtr.Zero) Marshal.FreeHGlobal(opt.Value); if (optlist.options != IntPtr.Zero) Marshal.FreeCoTaskMem(optlist.options); if(optlist.szConnection!=IntPtr.Zero)Marshal.FreeHGlobal(optlist.szConnection); Marshal.FreeCoTaskMem(pstruct); } return res; } } /* СТРУКТУРЫ */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct InternetPerConnOptionList { public int dwSize; public IntPtr szConnection; public int dwOptionCount; public int dwOptionError; public IntPtr options; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct INTERNET_PER_CONN_OPTION //первый вариант структуры (для указателя) { public uint dwOption; public IntPtr Value; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct INTERNET_PER_CONN_OPTION2 //второй вариант структуры (для DWORD) { public uint dwOption; public uint Value; } }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.