项目搭建(三):自定义DLL

说明:程序中有些自定义的控件类型在TestStack.White框架中没有涉及,需要引入自定义的DLL,通过鼠标点击事件处理

使用:将自定义的ClassLibrary2.dll拷贝到项目/bin/debug目录下,项目添加引用选择dll。

  --该dll定义了Control Patterns为空的点击事件类BaseClass;

  --该dll定义了查找控件属性类PropertyConditions;

 

一、 C#生成DLL文件

1.  在VS2015,文件->新建项目->项目类型visual C#->类库(注意必须是类库)

   --即新建一个由纯.cs 类库文件组成的程序集。

2.  编写代码  详细代码见附录:

  -文件名:Class1.cs

  -namespace:BaseTest

  -类名:BaseClass

3. 生成->生成[解决方案名]

  这样你的\Projects\ClassLibrary2\ClassLibrary2\bin\Debug文件夹或者\Projects\ClassLibrary2\ClassLibrary2\obj\Debug文件夹里便会自动生成 dll文件,该文件名称与项目名称一致,即为ClassLibrary2.dll。

 

二、引用DLL文件

 a. 首先把dll文件放到应用程序...\bin\Debug\下;

 b. 然后在解决方案中添加引用:右键鼠标-->添加引用-->浏览-->选择dll放置路径后点击“确定”。

 c. 在应用文件头处使用using BaseTest;

   调用 dll中方法时使用BaseClass.方法名

 

三、附录:自定义类库代码

using System;
using System.Text;
using System.Windows;
using System.Windows.Automation;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace BaseTest
{
    public class BaseClass
    {
        #region ClickMouse
        #region Import DLL

        /// <summary>
        /// Add mouse move event
        /// </summary>
        /// <param name="x">Move to specify x coordinate</param>
        /// <param name="y">Move to specify y coordinate</param>
        /// <returns></returns>

        [DllImport("user32.dll")]

        extern static bool SetCursorPos(int x, int y);

        /// <summary>
        /// Mouse click event
        /// </summary>
        /// <param name="mouseEventFlag">MouseEventFlag </param>
        /// <param name="incrementX">X coordinate</param>
        /// <param name="incrementY">Y coordinate</param>
        /// <param name="data"></param>
        /// <param name="extraInfo"></param>

        [DllImport("user32.dll")]

        extern static void mouse_event(int mouseEventFlag, int incrementX, int incrementY, uint data, UIntPtr extraInfo);
        const int MOUSEEVENTF_MOVE = 0x0001;
        const int MOUSEEVENTF_LEFTDOWN = 0x0002;
        const int MOUSEEVENTF_LEFTUP = 0x0004;
        const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
        const int MOUSEEVENTF_RIGHTUP = 0x0010;
        const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
        const int MOUSEEVENTF_MIDDLEUP = 0x0040;
        const int MOUSEEVENTF_ABSOLUTE = 0x8000;

        #endregion

        public static void ClickLeftMouse(int processId, string automationId)
        {
            AutomationElement element = FindElementById(processId, automationId);
            if (element == null)
            {
                throw new NullReferenceException(string.Format("Element with AutomationId '{0}' and Name '{1}' can not be find.",
                    element.Current.AutomationId, element.Current.Name));
            }
            Rect rect = element.Current.BoundingRectangle;
            int IncrementX = (int)(rect.Left + rect.Width / 2);
            int IncrementY = (int)(rect.Top + rect.Height / 2);
            //Make the cursor position to the element.
            SetCursorPos(IncrementX, IncrementY);
            //Make the left mouse down and up.
            mouse_event(MOUSEEVENTF_LEFTDOWN, IncrementX, IncrementY, 0, UIntPtr.Zero);
            mouse_event(MOUSEEVENTF_LEFTUP, IncrementX, IncrementY, 0, UIntPtr.Zero);
        }
        #endregion

        public static void ClickLeftMouseByName(int processId, string name)
        {
            AutomationElement element = FindElementByName(processId, name);
            if (element == null)
            {
                throw new NullReferenceException(string.Format("Element with Name '{0}' and Name '{1}' can not be find.",
                    element.Current.Name, element.Current.Name));
            }
            Rect rect = element.Current.BoundingRectangle;
            int IncrementX = (int)(rect.Left + rect.Width / 2);
            int IncrementY = (int)(rect.Top + rect.Height / 2);
            //Make the cursor position to the element.
            SetCursorPos(IncrementX, IncrementY);
            //Make the left mouse down and up.
            mouse_event(MOUSEEVENTF_LEFTDOWN, IncrementX, IncrementY, 0, UIntPtr.Zero);
            mouse_event(MOUSEEVENTF_LEFTUP, IncrementX, IncrementY, 0, UIntPtr.Zero);
        }


        /// <summary>
        /// Get the automation elemention of current form.
        /// </summary>
        /// <param name="processId">Process Id</param>
        /// <returns>Target element</returns>
        public static AutomationElement FindWindowByProcessId(int processId)
        {
            AutomationElement targetWindow = null;
            int count = 0;
            try
            {
                Process p = Process.GetProcessById(processId);
                targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
                return targetWindow;
            }
            catch (Exception ex)
            {
                count++;
                StringBuilder sb = new StringBuilder();
                string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
                if (count > 5)
                {
                    throw new InvalidProgramException(message, ex);
                }
                else
                {
                    return FindWindowByProcessId(processId);
                }
            }
        }

        // Get the automation element by automation Id.
        public static AutomationElement FindElementById(int processId, string automationId)

        {
            AutomationElement aeForm = FindWindowByProcessId(processId);
            AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
            new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
            return tarFindElement;
        }

        // Get the automation element by Name.
        public static AutomationElement FindElementByName(int processId, string name)

        {
            AutomationElement aeForm = FindWindowByProcessId(processId);
            AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
            new PropertyCondition(AutomationElement.NameProperty, name));
            return tarFindElement;
        }
        
        // get the button element and click
         public static void ClickButtonById(int processId,string buttonId)
        {
            AutomationElement element = FindElementById(processId,buttonId);
            if (element == null)
            {
                throw new NullReferenceException(string.Format("Element with AutomationId '{0}' can not be find.", element.Current.Name));
            }
            InvokePattern currentPattern = GetInvokePattern(element);
            currentPattern.Invoke();
        }
        
         #region InvokePattern helper
        /// <summary>
        /// Get InvokePattern
        /// </summary>
        /// <param name="element">AutomationElement instance</param>
        /// <returns>InvokePattern instance</returns>
        public static InvokePattern GetInvokePattern(AutomationElement element)
        {
            object currentPattern;
            if (!element.TryGetCurrentPattern(InvokePattern.Pattern, out currentPattern))
            {
                throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the InvokePattern.",
                    element.Current.AutomationId, element.Current.Name));
            }
            return currentPattern as InvokePattern;
        }

        #endregion
    }
}

 

posted @ 2019-09-20 07:46  happy_xiaoxiao  Views(499)  Comments(0Edit  收藏  举报