/// <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( @"保存ダイアログの終了を確認できません。"); } }