OSDN Git Service

入渠と遠征のタイマーをクリック可能だとわかるようにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / SystemProxy.cs
index bcc47d3..d49bfa1 100644 (file)
@@ -14,6 +14,7 @@
 \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
@@ -21,7 +22,7 @@ namespace KancolleSniffer
     public class SystemProxy\r
     {\r
         private InternetPerConnOptionList _orgList;\r
-        private string _currentUrl;\r
+        private Uri _initialUri;\r
 \r
         private void SaveSettings()\r
         {\r
@@ -45,6 +46,7 @@ namespace KancolleSniffer
             {\r
                 _orgList = list;\r
             }\r
+            AdjustLocalIntranetZoneFlags();\r
         }\r
 \r
         public void SetAutoConfigUrl(string url)\r
@@ -52,7 +54,8 @@ namespace KancolleSniffer
             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
@@ -83,8 +86,8 @@ namespace KancolleSniffer
             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
@@ -121,6 +124,21 @@ namespace KancolleSniffer
             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