/// <summary>
        /// 引数(<paramref name="windowHandle"/>)のウインドウハンドルを持つウィンドウが、
        /// 有効か無効か(マウスやキーボードの入力を受け付けるか受け付けないか)をチェックする
        /// </summary>
        /// <param name="windowHandle">チェック対象のウィンドウのハンドル</param>
        /// <exception cref="PlatformInvokeException">
        /// Win32Apiの処理「DLL:user32.dll、メソッド:IsWindowEnabled」の呼び出しに失敗した場合に発生
        /// </exception>
        /// <exception cref="Win32OperateException">
        /// Win32Apiの処理「DLL:user32.dll、メソッド:IsWindowEnabled」の処理に失敗した場合に発生
        /// </exception>
        /// <returns>ウィンドウが有効な場合:True、無効な場合:False</returns>
        public static bool IsWindowEnabled(HandleRef windowHandle)
        {
            // Win32Apiの実行処理
            // Win32ApiのWindou共通の呼び出し機能を用いて、ウィンドウの有効無効チェック処理を呼び出す
            Win32ApiResult Function()
            {
                bool win32ReturnValue = Win32Api.IsWindowEnabled(windowHandle);

                return(new Win32ApiResult(win32ReturnValue));
            }

            // 実行
            string         dllName    = "user32.dll";
            string         methodName = nameof(Win32Api.IsWindowEnabled);
            Win32ApiResult result     = Win32ApiCommon.Run(Function, dllName, methodName);

            // 取得したウインドウハンドルを返却
            return((bool)result.ReturnValue);
        }
        /// <summary>
        /// 現在ユーザーが作業している最前面ウィンドウのハンドルを取得する
        /// 取得できなかった場合は <see cref="IntPtr.Zero"/> を返却する
        /// </summary>
        /// <param name="isThrowExceptionGetFail">
        /// 取得したウィンドウハンドルに該当するウィンドウが下記の場合、
        /// 例外を発生させるかどうかを指定するフラグ
        /// ・アクティブウィンドウが存在しない
        /// ・取得したウィンドウハンドルのウィンドウがウィンドウではない
        /// ・表示されない(非表示)ウィンドウ
        /// ・無効(入力を受け付けない)なウィンドウ
        /// ・ディスクトップを示すウィンドウ
        /// このフラグを True にした場合、上記状態の場合に例外をスローする
        /// このフラグを False にした場合、上記状態の場合に <see cref="IntPtr.Zero"/> を返却する
        /// </param>
        /// <exception cref="PlatformInvokeException">
        /// Win32Apiの下記の処理の呼び出しに失敗した場合に発生
        /// ・「DLL:user32.dll、メソッド:GetForegroundWindow」
        /// ・「DLL:user32.dll、メソッド:IsWindow」
        /// ・「DLL:user32.dll、メソッド:IsWindowVisible」
        /// ・「DLL:user32.dll、メソッド:IsWindowEnabled」
        /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」
        /// </exception>
        /// <exception cref="Win32OperateException">
        /// Win32Apiの下記の処理に失敗した場合に発生
        /// ・「DLL:user32.dll、メソッド:GetForegroundWindow」
        /// ・「DLL:user32.dll、メソッド:IsWindow」
        /// ・「DLL:user32.dll、メソッド:IsWindowVisible」
        /// ・「DLL:user32.dll、メソッド:IsWindowEnabled」
        /// ・「DLL:user32.dll、メソッド:GetDesktopWindow」
        /// (例外発生フラグが True の場合で、
        ///  取得したウィンドウハンドルの値が相応しくない場合もこの例外を発生させる)
        /// </exception>
        /// <returns>
        /// 現在ユーザーが作業している最前面ウィンドウのハンドル
        /// 取得できなかった場合は<see cref="IntPtr.Zero"/> を返却する
        /// </returns>
        public static IntPtr GetForegroundWindowHandle(bool isThrowExceptionGetFail)
        {
            // Win32Apiの実行処理
            // Win32ApiのWindou共通の呼び出し機能を用いて、最前面のウィンドウのハンドルを取得する
            Win32ApiResult Function()
            {
                // 最前面のウィンドウのハンドルを取得
                IntPtr windowHandle = Win32Api.GetForegroundWindow();

                // 取得したウィンドウのチェック
                HandleRef tmpHandle   = new HandleRef(0, windowHandle);
                bool      win32Result = windowHandle != IntPtr.Zero &&
                                        Win32Api.IsWindow(tmpHandle) &&
                                        Win32Api.IsWindowVisible(tmpHandle) &&
                                        Win32Api.IsWindowEnabled(tmpHandle) &&
                                        windowHandle != Win32Api.GetDesktopWindow();

                // チェックOKの場合は取得したウィンドウハンドルを、NGの場合はIntPtr.Zeroを返却
                return(new Win32ApiResult(win32Result ? windowHandle : IntPtr.Zero));
            }

            // 実行
            string         dllName    = "user32.dll";
            string         methodName = nameof(Win32Api.GetForegroundWindow);
            Win32ApiResult result     = Win32ApiCommon.Run(Function, dllName, methodName);
            IntPtr         handle     = (IntPtr)result.ReturnValue;

            // 例外発生フラグが立っている場合、取得成功か判定
            if (isThrowExceptionGetFail && handle == IntPtr.Zero)
            {
                // 取得失敗の場合、例外をスローする
                throw Win32ApiCommon.GetWin32OperateException(dllName, methodName);
            }

            // 取得したウインドウハンドルを返却
            return(handle);
        }