知道如何使用Windows 7
对C#
执行以下操作吗?
Control Panel
-> Internet Options
-> Connections
> LAN Settings
选中或取消选中CheckBox
说Use a Proxy server for your LAN
参考方案
下面是我适合使用InternetSetOption
和InternetQueryOption
的正确方法(无需编辑注册表)的类,包括将更改通知给OS和应用程序,因此无需重新启动。
public class InternetSettings
{
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 bool SetProxy(string strProxy)
{
InternetPerConnOptionList request = new InternetPerConnOptionList();
InternetPerConnOption[] options = new InternetPerConnOption[2];
int optionSize = 0;
IntPtr optionsPtr = IntPtr.Zero;
try
{
options[0].dwOption = OptionType.INTERNET_PER_CONN_FLAGS;
options[0].Value.dwValue = (int)ProxyFlags.PROXY_TYPE_PROXY;
options[1].dwOption = OptionType.INTERNET_PER_CONN_PROXY_SERVER;
options[1].Value.szValue = String.IsNullOrEmpty(strProxy) ? IntPtr.Zero : Marshal.StringToHGlobalAnsi(strProxy);
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 bool SetProxy(string strProxy, string strExceptions)
{
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_PROXY;
options[1].dwOption = OptionType.INTERNET_PER_CONN_PROXY_SERVER;
options[1].Value.szValue = String.IsNullOrEmpty(strProxy) ? IntPtr.Zero : Marshal.StringToHGlobalAnsi(strProxy);
options[2].dwOption = OptionType.INTERNET_PER_CONN_PROXY_BYPASS;
options[2].Value.szValue = String.IsNullOrEmpty(strExceptions) ? IntPtr.Zero : Marshal.StringToHGlobalAnsi(strExceptions);
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);
}
}
}
}
#region WinInet structures
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct InternetPerConnOptionList
{
public int dwSize;
public IntPtr pszConnection;
public int dwOptionCount;
public int dwOptionError;
public IntPtr pOptions;
};
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
public struct InternetPerConnOptionData
{
[FieldOffset(0)]
public int dwValue;
[FieldOffset(0)]
public IntPtr szValue;
[FieldOffset(0)]
public System.Runtime.InteropServices.ComTypes.FILETIME ftValue;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct InternetPerConnOption
{
public OptionType dwOption;
public InternetPerConnOptionData Value;
}
#endregion
#region WinInet enums
//
// options manifests for Internet{Query|Set}Option
//
public enum InternetOptionActions : uint
{
INTERNET_OPTION_REFRESH = 37,
INTERNET_OPTION_SETTINGS_CHANGED = 39,
INTERNET_OPTION_PER_CONNECTION_OPTION = 75
}
//
// Options used in INTERNET_PER_CONN_OPTON struct
//
public enum OptionType
{
INTERNET_PER_CONN_FLAGS = 1,
INTERNET_PER_CONN_PROXY_SERVER = 2,
INTERNET_PER_CONN_PROXY_BYPASS = 3,
INTERNET_PER_CONN_AUTOCONFIG_URL = 4,
INTERNET_PER_CONN_AUTODISCOVERY_FLAGS = 5,
INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL = 6,
INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS = 7,
INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_TIME = 8,
INTERNET_PER_CONN_AUTOCONFIG_LAST_DETECT_URL = 9
}
//
// PER_CONN_FLAGS
//
[Flags]
public enum ProxyFlags
{
PROXY_TYPE_DIRECT = 0x00000001, // direct to net
PROXY_TYPE_PROXY = 0x00000002, // via named proxy
PROXY_TYPE_AUTO_PROXY_URL = 0x00000004, // autoproxy URL
PROXY_TYPE_AUTO_DETECT = 0x00000008 // use autoproxy detection
}
#endregion
internal static class NativeMethods
{
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetQueryOption(IntPtr hInternet, InternetOptionActions dwOption, ref InternetPerConnOptionList lpOptionList, ref int lpdwBufferLength);
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetSetOption(IntPtr hInternet, InternetOptionActions dwOption, ref InternetPerConnOptionList lpOptionList, int lpdwBufferLength);
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetSetOption(IntPtr hInternet, InternetOptionActions dwOption, IntPtr lpbuf, int lpdwBufferLength);
}
}
像这样使用它:
InternetSettings.SetProxy("192.168.0.2", "(local);myexception.com");
和
InternetSettings.UnsetProxy();
如何将选定的<options>存储到PHP数组中? - php所以我试图将选定的<option></option>标签存储到数组中。我到处搜索,找不到任何“好的”方法。<form action='most-liked.php'> <select multiple name='choose-category' style='dis…
如果我在iframe中添加网址“ http://www.yahoo.com”,则会出现错误“拒绝显示,将'X-Frame-Options'设置为'DENY'”。那么如何解决? - javascript我在页面中有一个iframe,无论我在地址栏中键入什么url,它都会在iframe中呈现该url,但是对于http://www.yahoo.com,它显示空白的iframe,并给我错误消息“拒绝在a中显示'https://in.yahoo.com/?p=us'框架,因为它将“ X-Frame-Options”设置为“ DENY””现在…
如何使用C++扩展python? - c++多亏了this handy skeleton module,我已经用C成功扩展了python。但是我找不到用于C++的程序,尝试修复C++在编译此骨架模块时给出的错误时遇到了循环依赖问题。如何使用C++扩展Python?如果不需要,我宁愿不依赖Boost(或SWIP或其他库)。依赖是一种痛苦。最好的情况是,我找到一个已经用C++编译的框架文件。这是我为C++…
在高级功能中访问低级功能选项的清晰方法? - python我编写了一个Python程序包,该程序包经常对低级函数low_level_a(arg)进行间接调用。我所说的“间接”是指该函数通常隐藏在高层函数和类的几层后面。我现在要实现函数的替代版本low_level_b(arg),该函数采用相同类型的参数并返回相同类型的输出。我的目标是允许用户在调用最高级别的函数时在使用low_level_a(arg)和low_lev…
自定义页面筛选器中的ASP .NET Core注入服务 - c#我已经设置了一个过滤器来处理特定的文件夹及其中的所有页面。我需要使用声明访问数据库。问题是我似乎无法在启动服务上向DI注册过滤器,因为它找不到数据库连接services.AddMvc() .AddRazorPagesOptions(options => { options.AllowAreas = true; options.Conventions.A…