Fragrammer’s Blog

破片プログラマーから脱する

メモ帳開いて勝手に保存(UI Automation)

コメント欄でアドバイスして下さったid:u338stevenさんのおかげで、
一気に保存まで達成。ありがとうございました。

前のUWSCでメモ帳保存のUI Automation版
1.メモ帳起動
2.「ああああああ」を書き込む
3.「テスト.txt」でカレントパスに保存

using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Automation;
using System.Windows.Forms;

namespace UIAutoPractice
{
    class Program
    {
        private static readonly string PROCESS_NAME = @"notepad";
        private static readonly int DEFAULT_WAIT_TIME = 1000;

        private static AutomationElement mainForm;
        static void Main(string[] args)
        {
            Process process = Process.Start(PROCESS_NAME);
            try
            {
                // メモ帳を起動します
                Thread.Sleep(DEFAULT_WAIT_TIME);
                mainForm = AutomationElement.FromHandle(process.MainWindowHandle);
                // ああああああ
                string InputText = "ああああああ";
                // 入力準備
                object valuePattern = null;
                if (!mainForm.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                {
                    mainForm.SetFocus();
                    Thread.Sleep(100);
                    SendKeys.SendWait(InputText);
                }
                else
                {
                    mainForm.SetFocus();
                    ((ValuePattern)valuePattern).SetValue(InputText);
                }
                // 閉じる
                if (mainForm.TryGetCurrentPattern(WindowPattern.Pattern, out valuePattern))
                {
                    mainForm.SetFocus();
                    ((WindowPattern)valuePattern).Close();
                }
                // フォーカス当たるまで待機
                Thread.Sleep(1000);
                // 保存するかどうか聞かれた時のダイアログを取得
                AutomationElement subForm = AutomationElement.FocusedElement;
                // 保存ボタン取得
                var btn = subForm.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
                // 保存実行
                btn.Invoke();
                // 再度保存するかどうか聞かれる場合があるため、若干待機させる
                Thread.Sleep(500);
                // 保存するかどうか聞かれた時のダイアログを取得
                var SaveTextBoxElem = AutomationElement.FocusedElement as AutomationElement;
                SaveTextBoxElem.SetFocus();
                // Test.txtでカレントパスに保存
                SendKeys.SendWait("Test");
                // Enterキー押下
                SendKeys.SendWait("{ENTER}");       
            }
            finally
            {
                process.CloseMainWindow();
            }
        }
    }
}