zoukankan      html  css  js  c++  java
  • 项目搭建(三):自定义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. 生成->生成[解决方案名]

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

    二、引用DLL文件

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

     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
        }
    }
  • 相关阅读:
    软件包的作用
    Sqlserver2008 表分区教程
    C#通用类型转换 Convert.ChangeType
    缓存 HttpContext.Current.Cache和HttpRuntime.Cache的区别
    用户信息 Froms验证票证
    .NET4.0 __doPostBack未定义
    TFS2012 安装 配置笔记
    MVC学习笔记一
    新博客..第一天..
    ORACLE多表查询优化
  • 原文地址:https://www.cnblogs.com/happy-xiaoxiao/p/11553658.html
Copyright © 2011-2022 走看看