NotepadAutomationDemo代码V1

本文介绍如何使用自动化脚本启动记事本程序,并通过自动化事件处理进行文件创建、保存和替换操作。

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Automation;
using System.Threading;

 

namespace UIANotepad
{
    class NotepadAutomationDemo
    {
        static AutomationElement notepadWin = null;

        static string editPanelID = "15";
        static string fileMenuID = "Item 1";
        static string saveMenuItemID = "Item 3";
        static string pathTextID = "1001";
        static string saveBtnID = "1";
        static string replaceBtnID = "CommandButton_6";
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main()
        {
            AutomationEventHandler AEHandler = new AutomationEventHandler(OnNotepadOpen);
            Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent, AutomationElement.RootElement, TreeScope.Children, AEHandler);

            System.Diagnostics.Process.Start("notepad.exe");
            Console.ReadLine();
        }

        private static void OnNotepadOpen(object src, AutomationEventArgs args)
        {
            AutomationElement notepad;
            try
            {
                notepad = src as AutomationElement;

                if ("Untitled - Notepad" == notepad.Current.Name)
                {
                    notepadWin = notepad;

                    DoSomething();
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private static void DoSomething()
        {
            SayHello();
            SaveToFile("Hello");
        }

        private static void SaveToFile(string fileName)
        {
            ClickFileMenu();
            ClickSaveMenuItem();
            TypeFileName(fileName);
            ClickSaveButton();
            ConfirmSave();
        }

        private static void ConfirmSave()
        {
            bool diagShowUP = ConfirmSaveASExists();
            SaveASConfirmed();
        }

        private static void SaveASConfirmed()
        {
            ExecuteInvokePattern(replaceBtnID, ControlType.Button);
        }

        private static bool ConfirmSaveASExists()
        {
            AndCondition conditions = new AndCondition(new PropertyCondition(AutomationElement.ClassNameProperty, "Confirm Save As"),
                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
            AutomationElementCollection ctrls = notepadWin.FindAll(TreeScope.Descendants, conditions);

            if (ctrls == null || ctrls.Count == 0)
                return false;
            else
                return true;
        }

        private static void ClickSaveButton()
        {
            ExecuteInvokePattern(saveBtnID, ControlType.Button);
        }

        private static void TypeFileName(string fileName)
        {
            SetValuePattern(pathTextID, ControlType.Edit, fileName);
        }

        private static void ClickSaveMenuItem()
        {
            ExecuteInvokePattern(saveMenuItemID, ControlType.MenuItem);
        }

        private static void ClickFileMenu()
        {
            ExecuteCollapsePattern(fileMenuID, ControlType.MenuItem);
        }

        private static void SayHello()
        {
            InputText(editPanelID, ControlType.Document, "Hello");
        }

        static void ExecuteInvokePattern(string ctrlID, ControlType ctrlType)
        {
            AndCondition conditions = new AndCondition(
                new PropertyCondition(AutomationElement.AutomationIdProperty, ctrlID),
                new PropertyCondition(AutomationElement.ControlTypeProperty, ctrlType));

            AutomationElement ctrl = notepadWin.FindAll(TreeScope.Descendants, conditions)[0];
            InvokePattern ip = (InvokePattern)ctrl.GetCurrentPattern(InvokePattern.Pattern);
            ip.Invoke();
        }

        static void SetValuePattern(string ctrlID, ControlType ctrlType, string str)
        {
            AndCondition conditions = new AndCondition(
                new PropertyCondition(AutomationElement.AutomationIdProperty, ctrlID),
                new PropertyCondition(AutomationElement.ControlTypeProperty, ctrlType));

            AutomationElementCollection elements = null;
            int count = 0;
            do
            {
                elements = notepadWin.FindAll(TreeScope.Descendants, conditions);
                if (count > 5)
                {
                    Console.WriteLine("Cannot find file name text box1");
                    return;
                }
                else
                {
                    count ++;
                    Thread.Sleep(100);
                }
            } while (elements == null || elements.Count == 0);
            AutomationElement ctrl = elements[0];
            ValuePattern vp = (ValuePattern)ctrl.GetCurrentPattern(ValuePattern.Pattern);
            vp.SetValue(str);
        }

        static void ExecuteCollapsePattern(string ctrlID, ControlType ctrlType)
        {
            AndCondition conditions = new AndCondition(
                new PropertyCondition(AutomationElement.AutomationIdProperty, ctrlID),
                new PropertyCondition(AutomationElement.ControlTypeProperty, ctrlType));

            AutomationElement ctrl = notepadWin.FindAll(TreeScope.Descendants, conditions)[0];
            ExpandCollapsePattern ep = (ExpandCollapsePattern)ctrl.GetCurrentPattern(ExpandCollapsePattern.Pattern);
            ep.Expand();
        }

        static void InputText(string ctrlID, ControlType ctrlType, string words)
        {
          
            AndCondition conditions = new AndCondition(
                new PropertyCondition(AutomationElement.AutomationIdProperty, ctrlID),
                new PropertyCondition(AutomationElement.ControlTypeProperty, ctrlType));

            AutomationElement ctrl = notepadWin.FindAll(TreeScope.Descendants, conditions)[0];

            ctrl.SetFocus();           
            System.Windows.Forms.SendKeys.SendWait(words);
        }
    }
}

先看效果: https://pan.quark.cn/s/c7070e7537b1 [!NOTE] 每到答辩季我就会喜获stars,谢谢大家的支持! 欢迎推广传播本repo(https://.com/atomiechen/THU-PPT-Theme),也欢迎贡献变体,提供更多选择 清华简约主题PPT模板 Repo stars 2020年春夏之交,答辩期间很多同学都在寻找清华主题的答辩模板。 一方面有使用LaTeX制作Beamer的模板(见Overleaf上的模板THU Beamer Theme),另一方面民间也存在着一些PPT模板。 很多人可能不适应Beamer的使用(主要是内容和排版设计不是可见即所得,定制有门槛),以及我找到的PPT模板也都不太好使(要么图案设计太复杂、不好看,要么没有制作成PPT母版导致每次使用都要复制粘贴+微调,不方便)。 我制作了清华简约主题的PPT模板,后续有新的设计我会逐渐加入,也欢迎有兴趣有想法的朋友们添砖加瓦! 内容 所有模板均为 文件。 此外也提供转换脚本用于 Pandoc自动生成PPTX。 各个版本的修改历史见 CHANGELOG.md。 下载 推荐直接从 Releases 下载最新发布版。 也可以在 仓库 单独下载所需文件。 效果 16:9比例,v1留边、v1顶边、v3留边白底、v3顶边白底: demo 16:9比例,其他风格模板:v1扁平、v2扁平、v1暗光 demo2 其他变体设计参见 variants/README.md。 使用方式 可以基于所提供的文件自行修改内容,也可以在新建的PPT文稿中应用该模板。 后者在 MS Office 2019 For Mac 的 PowerPoint 里的具体使用方式为:首先选择幻灯片尺...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值