\r
using System;\r
using System.Runtime.InteropServices;\r
+using Microsoft.Win32;\r
using FILETIME = System.Runtime.InteropServices.ComTypes.FILETIME;\r
\r
namespace KancolleSniffer\r
public class SystemProxy\r
{\r
private InternetPerConnOptionList _orgList;\r
- private string _currentUrl;\r
+ private Uri _initialUri;\r
\r
private void SaveSettings()\r
{\r
{\r
_orgList = list;\r
}\r
+ AdjustLocalIntranetZoneFlags();\r
}\r
\r
public void SetAutoConfigUrl(string url)\r
SaveSettings();\r
var flagValue = new InternetPerConnOptionValue {dwValue = (int)PerConnFlags.PROXY_TYPE_AUTO_PROXY_URL};\r
var urlValue = new InternetPerConnOptionValue {pszValue = Marshal.StringToHGlobalAuto(url)};\r
- _currentUrl = url;\r
+ if (_initialUri == null)\r
+ Uri.TryCreate(url, UriKind.Absolute, out _initialUri);\r
var opts = new[]\r
{\r
new InternetPerConnOption {dwOption = PerConnOption.INTERNET_PER_CONN_FLAGS, Value = flagValue},\r
var size = Marshal.SizeOf(typeof(InternetPerConnOption));\r
var urlOpt = (InternetPerConnOption)\r
Marshal.PtrToStructure((IntPtr)((long)_orgList.pOptions + size), typeof(InternetPerConnOption));\r
- var orgUrl = Marshal.PtrToStringUni(urlOpt.Value.pszValue);\r
- if (orgUrl == _currentUrl) // The restoration was sikipped or failed at last time.\r
+ Uri.TryCreate(Marshal.PtrToStringUni(urlOpt.Value.pszValue) ?? "", UriKind.Absolute, out var orgUri);\r
+ if (orgUri?.Authority == _initialUri?.Authority) // The restoration was sikipped or failed at last time.\r
{\r
// Unselect the Use automatic configration script check box.\r
var flagsOpt =\r
InternetSetOption(IntPtr.Zero, InternetOption.INTERNET_OPTION_PROXY_SETTINGS_CHANGED, IntPtr.Zero, 0);\r
}\r
\r
+ /// <summary>\r
+ /// PACファイルでDIRECTを指定すると、すべてのサイトがローカルイントラネットになり、\r
+ /// IEが互換表示になるなどの不具合があるので、イントラネットにならないようにする\r
+ /// </summary>\r
+ private void AdjustLocalIntranetZoneFlags()\r
+ {\r
+ var zones = Registry.CurrentUser.OpenSubKey(\r
+ @"Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\1", true);\r
+ if (zones == null)\r
+ return;\r
+ if (!(zones.GetValue("Flags") is int flags))\r
+ return;\r
+ zones.SetValue("Flags", flags & (-1 ^ 0x108));\r
+ }\r
+\r
[DllImport("WinInet.dll", CharSet = CharSet.Unicode)]\r
private static extern bool InternetQueryOption(IntPtr hInternet, InternetOption dwOption,\r
ref InternetPerConnOptionList optionList, ref int lpdwBufferLength);\r