/// <summary>
            /// ファイル名エディットコントロールの入力内容確定処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            private async Task DoDecideFilePathTaskByControl(SaveDialogItemSet itemSet)
            {
                var edit = itemSet?.FileNameEditControl;

                if (edit == null)
                {
                    throw new ArgumentException(
                              @"コントロール操作用パラメータを取得できていません。",
                              nameof(itemSet));
                }

                // ENTERキー押下
                edit.PostMessage(
                    WM_KEYDOWN,
                    new IntPtr(VK_RETURN),
                    new IntPtr(0x00000001));
                edit.PostMessage(
                    WM_KEYUP,
                    new IntPtr(VK_RETURN),
                    new IntPtr(unchecked ((int)0xC0000001)));

                // 保存ダイアログが閉じるまで待つ
                var dialog =
                    await RepeatUntil(
                        () => this.FindDialog(DialogType.Save),
                        (Win32Window d) => d == null,
                        150);

                if (dialog != null)
                {
                    throw new InvalidOperationException(
                              @"保存ダイアログの終了を確認できません。");
                }
            }
            /// <summary>
            /// WAVEファイルパスをファイル名エディットへ設定する処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            /// <param name="filePath">WAVEファイルパス。</param>
            private async Task DoSetFilePathToEditTaskByControl(
                SaveDialogItemSet itemSet,
                string filePath)
            {
                if (string.IsNullOrWhiteSpace(filePath))
                {
                    throw new ArgumentException(
                              @"不正なファイルパスです。",
                              nameof(filePath));
                }

                var edit = itemSet?.FileNameEditControl;

                if (edit == null)
                {
                    throw new ArgumentException(
                              @"コントロール操作用パラメータを取得できていません。",
                              nameof(itemSet));
                }

                for (var sw = Stopwatch.StartNew(); ; await Task.Delay(10))
                {
                    // ファイルパス設定
                    var timeout =
                        Math.Max((int)(UIControlTimeout - sw.ElapsedMilliseconds), 100);
                    var ok = await Task.Run(() => edit.SetText(filePath, timeout));

                    if (!ok)
                    {
                        throw new InvalidOperationException(
                                  @"ファイルパス設定処理がタイムアウトしました。 " +
                                  nameof(filePath) + @".Length=" + filePath.Length);
                    }

                    // パス設定できていない場合があるので、設定されていることを確認する
                    timeout =
                        Math.Max((int)(UIControlTimeout - sw.ElapsedMilliseconds), 100);
                    var text = await Task.Run(() => edit.GetText(timeout));

                    if (text == filePath)
                    {
                        break;
                    }

                    if (sw.ElapsedMilliseconds >= UIControlTimeout)
                    {
                        throw new InvalidOperationException(
                                  @"ファイルパスを設定できませんでした。");
                    }
                }
            }
            /// <summary>
            /// WAVEファイルパスをファイル名エディットへ設定する処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            /// <param name="filePath">WAVEファイルパス。</param>
            /// <returns>成功したならば true 。そうでなければ false 。</returns>
            private async Task <bool> DoSetFilePathToEditTask(
                SaveDialogItemSet itemSet,
                string filePath)
            {
                if (itemSet == null || string.IsNullOrWhiteSpace(filePath))
                {
                    return(false);
                }

                // まず UI Automation を試す
                Exception exAuto = null;

                if (itemSet.IsUIAutomationEnabled)
                {
                    try
                    {
                        await this.DoSetFilePathToEditTaskByAutomation(itemSet, filePath);

                        return(true);
                    }
                    catch (Exception ex)
                    {
                        exAuto = ex;
                    }
                }

                // コントロール操作を試す
                try
                {
                    await this.DoSetFilePathToEditTaskByControl(itemSet, filePath);

                    if (exAuto != null)
                    {
                        ThreadDebug.WriteException(exAuto);
                    }
                    return(true);
                }
                catch (Exception exCtrl)
                {
                    if (exAuto != null)
                    {
                        ThreadTrace.WriteException(exAuto);
                    }
                    ThreadTrace.WriteException(exCtrl);
                }

                return(false);
            }
            /// <summary>
            /// ファイル名エディットコントロールの入力内容確定処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            /// <returns>成功したならば true 。そうでなければ false 。</returns>
            private async Task <bool> DoDecideFilePathTask(SaveDialogItemSet itemSet)
            {
                if (itemSet == null)
                {
                    return(false);
                }

                // まず UI Automation を試す
                Exception exAuto = null;

                if (itemSet.IsUIAutomationEnabled)
                {
                    try
                    {
                        await this.DoDecideFilePathTaskByAutomation(itemSet);

                        return(true);
                    }
                    catch (Exception ex)
                    {
                        exAuto = ex;
                    }
                }

                // コントロール操作を試す
                try
                {
                    await this.DoDecideFilePathTaskByControl(itemSet);

                    if (exAuto != null)
                    {
                        ThreadDebug.WriteException(exAuto);
                    }
                    return(true);
                }
                catch (Exception exCtrl)
                {
                    if (exAuto != null)
                    {
                        ThreadTrace.WriteException(exAuto);
                    }
                    ThreadTrace.WriteException(exCtrl);
                }

                return(false);
            }
            /// <summary>
            /// WAVEファイルパスをファイル名エディットへ設定する処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            /// <param name="filePath">WAVEファイルパス。</param>
            private async Task DoSetFilePathToEditTaskByAutomation(
                SaveDialogItemSet itemSet,
                string filePath)
            {
                if (string.IsNullOrWhiteSpace(filePath))
                {
                    throw new ArgumentException(
                              @"不正なファイルパスです。",
                              nameof(filePath));
                }

                var edit = itemSet?.FileNameEditElement;

                if (
                    edit == null ||
                    itemSet?.OkButtonElement == null ||
                    itemSet?.IsUIAutomationEnabled != true)
                {
                    throw new ArgumentException(
                              @"UI Automation 用パラメータを取得できていません。",
                              nameof(itemSet));
                }

                // 入力可能状態まで待機
                if (!(await this.WhenForInputIdle()))
                {
                    throw new InvalidOperationException(@"入力可能状態になりません。");
                }

                // フォーカス
                edit.SetFocus();

                // ファイルパス設定
                if (!SetElementValue(edit, filePath))
                {
                    throw new InvalidOperationException(@"ファイルパスを設定できません。");
                }
            }
            /// <summary>
            /// ファイル名エディットコントロールの入力内容確定処理を行う。
            /// </summary>
            /// <param name="itemSet">保存ダイアログアイテムセット。</param>
            private async Task DoDecideFilePathTaskByAutomation(SaveDialogItemSet itemSet)
            {
                var okButton = itemSet?.OkButtonElement;

                if (okButton == null || itemSet?.IsUIAutomationEnabled != true)
                {
                    throw new ArgumentException(
                              @"UI Automation 用パラメータを取得できていません。",
                              nameof(itemSet));
                }

                // 入力可能状態まで待機
                if (!(await this.WhenForInputIdle()))
                {
                    throw new InvalidOperationException(@"入力可能状態になりません。");
                }
                okButton.SetFocus();

                // OKボタン押下
                if (!InvokeElement(okButton))
                {
                    throw new InvalidOperationException(@"OKボタンを押下できません。");
                }

                // 保存ダイアログが閉じるまで待つ
                var dialog =
                    await RepeatUntil(
                        () => this.FindDialog(DialogType.Save),
                        (Win32Window d) => d == null,
                        150);

                if (dialog != null)
                {
                    throw new InvalidOperationException(
                              @"保存ダイアログの終了を確認できません。");
                }
            }