OSDN Git Service

PostClass.CreatedAtの型をDateTimeUtcに変更
[opentween/open-tween.git] / OpenTween / NativeMethods.cs
index e986215..f4ccc24 100644 (file)
@@ -33,6 +33,7 @@ using System.Net;
 using System.Runtime.InteropServices;
 using System.Threading;
 using System.Windows.Forms;
+using System.Text;
 using OpenTween.Connection;
 
 namespace OpenTween
@@ -152,24 +153,6 @@ namespace OpenTween
             return SelectItem(listView, -1 /* all items */);
         }
 
-        [DllImport("user32")]
-        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
-
-        /// <summary>
-        /// 最小化状態のウィンドウを最小化する前の状態に復元します。
-        /// </summary>
-        /// <param name="window">復元するウィンドウ。</param>
-        /// <exception cref="System.ArgumentNullException"><paramref name="window"/> が null です。</exception>
-        public static void RestoreWindow(IWin32Window window)
-        {
-            if (window == null)
-            {
-                throw new ArgumentNullException("window");
-            }
-
-            ShowWindow(window.Handle, /* SW_RESTORE */ 9);
-        }
-
         #region "画面ブリンク用"
         public static bool FlashMyWindow(IntPtr hwnd,
             FlashSpecification flashType,
@@ -196,6 +179,7 @@ namespace OpenTween
         }
         /// http://www.atmarkit.co.jp/fdotnet/dotnettips/723flashwindow/flashwindow.html
         [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
         private static extern bool FlashWindowEx(
             ref FLASHWINFO FWInfo);
 
@@ -224,6 +208,7 @@ namespace OpenTween
         #endregion
 
         [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
         public static extern bool ValidateRect(
             IntPtr hwnd,
             IntPtr rect);
@@ -244,10 +229,11 @@ namespace OpenTween
 
         #region "スクリーンセーバー起動中か判定"
         [DllImport("user32", CharSet = CharSet.Auto)]
-        private static extern int SystemParametersInfo(
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool SystemParametersInfo(
                     int intAction,
                     int intParam,
-                    ref bool bParam,
+                    [MarshalAs(UnmanagedType.Bool)] ref bool bParam,
                     int intWinIniFlag);
         // returns non-zero value if function succeeds
 
@@ -282,7 +268,7 @@ namespace OpenTween
             {
                 // use the GlobalAddAtom API to get a unique ID (as suggested by MSDN docs)
                 registerCount++;
-                var atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + targetForm.Name + registerCount.ToString();
+                var atomName = Thread.CurrentThread.ManagedThreadId.ToString("X8") + targetForm.Name + registerCount;
                 hotkeyID = GlobalAddAtom(atomName);
                 if (hotkeyID == 0)
                 {
@@ -320,17 +306,12 @@ namespace OpenTween
         #region "プロセスのProxy設定"
 
         [DllImport("wininet.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
         private static extern bool InternetSetOption(IntPtr hInternet,
             InternetOption dwOption,
             [In] ref InternetProxyInfo lpBuffer,
             int lpdwBufferLength);
 
-        [DllImport("wininet.dll", SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
-        private static extern bool InternetSetOption(IntPtr hInternet,
-            InternetOption dwOption,
-            string lpBuffer,
-            int lpdwBufferLength);
-
         private enum InternetOption
         {
             PROXY = 38,
@@ -405,26 +386,6 @@ namespace OpenTween
                 throw new Win32Exception();
         }
 
-        private static void RefreshProxyAccount(string username, string password)
-        {
-            if (!string.IsNullOrEmpty(username) || !string.IsNullOrEmpty(password))
-            {
-                if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_USERNAME, (string)null, 0))
-                    throw new Win32Exception();
-
-                if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_PASSWORD, (string)null, 0))
-                    throw new Win32Exception();
-            }
-            else
-            {
-                if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_USERNAME, username, username.Length + 1))
-                    throw new Win32Exception();
-
-                if (!InternetSetOption(IntPtr.Zero, InternetOption.PROXY_PASSWORD, password, password.Length + 1))
-                    throw new Win32Exception();
-            }
-        }
-
         public static void SetProxy(ProxyType pType, string host, int port, string username, string password)
         {
             string proxy = null;
@@ -437,12 +398,10 @@ namespace OpenTween
                 proxy = "";
                 break;
             case ProxyType.Specified:
-                proxy = host + (port > 0 ? ":" + port.ToString() : "");
+                proxy = host + (port > 0 ? ":" + port : "");
                 break;
             }
             RefreshProxySettings(proxy);
-            // グローバルプロキシ (NULL = IntPtr.Zero) にユーザー名・パスワードをセットできないため無効化
-            //RefreshProxyAccount(username, password);
         }
 #endregion
 
@@ -492,5 +451,90 @@ namespace OpenTween
 
             return si.nPos;
         }
+
+        #region "ウィンドウの検索"
+
+        [DllImport("user32.dll")]
+        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint procId);
+        
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private delegate bool EnumWindowCallback(IntPtr hWnd, int lParam);
+
+        [DllImport("user32")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool EnumWindows(EnumWindowCallback lpEnumFunc, IntPtr lParam);
+
+        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
+        private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
+
+        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
+        private static extern int GetWindowTextLength(IntPtr hWnd);
+
+        /// <summary>
+        /// 指定したPIDとタイトルを持つウィンドウのウィンドウハンドルを取得します
+        /// </summary>
+        /// <param name="pid">対象ウィンドウのPID</param>
+        /// <param name="searchWindowTitle">対象ウィンドウのタイトル</param>
+        /// <returns>ウィンドウハンドル。検索に失敗した場合は<see cref="IntPtr.Zero"/></returns>
+        public static IntPtr GetWindowHandle(uint pid, string searchWindowTitle)
+        {
+            var foundHwnd = IntPtr.Zero;
+
+            EnumWindows((hWnd, lParam) =>
+            {
+                GetWindowThreadProcessId(hWnd, out var procId);
+
+                if (procId == pid)
+                {
+                    int windowTitleLen = GetWindowTextLength(hWnd);
+
+                    if (windowTitleLen > 0)
+                    {
+                        StringBuilder windowTitle = new StringBuilder(windowTitleLen + 1);
+                        GetWindowText(hWnd, windowTitle, windowTitle.Capacity);
+
+                        if (windowTitle.ToString().Contains(searchWindowTitle))
+                        {
+                            foundHwnd = hWnd;
+                            return false;
+                        }
+                    }
+                }
+
+                return true;
+            }, IntPtr.Zero);
+
+            return foundHwnd;
+        }
+
+        #endregion
+
+        #region "ウィンドウのアクティブ化"
+
+        private enum ShowWindowCommands : int
+        {
+            /// <summary>最小化・最大化されたウィンドウを元に戻して表示</summary>
+            SW_RESTORE = 9,
+        }
+
+        [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool ShowWindow(IntPtr hWnd, ShowWindowCommands nCmdShow);
+
+        [DllImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool SetForegroundWindow(IntPtr hWnd);
+
+        /// <summary>
+        /// 指定したウィンドウをアクティブにします
+        /// </summary>
+        /// <param name="hWnd">アクティブにするウィンドウのウィンドウハンドル</param>
+        public static void SetActiveWindow(IntPtr hWnd)
+        {
+            ShowWindow(hWnd, ShowWindowCommands.SW_RESTORE);
+            SetForegroundWindow(hWnd);
+        }
+
+        #endregion
     }
 }