项目搭建(三):自定义DLL
阅读原文时间:2023年07月15日阅读:1

说明:程序中有些自定义的控件类型在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 / );  
        int IncrementY = (int)(rect.Top + rect.Height / );  
        //Make the cursor position to the element.  
        SetCursorPos(IncrementX, IncrementY);  
        //Make the left mouse down and up.  
        mouse\_event(MOUSEEVENTF\_LEFTDOWN, IncrementX, IncrementY, , UIntPtr.Zero);  
        mouse\_event(MOUSEEVENTF\_LEFTUP, IncrementX, IncrementY, , 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 / );  
        int IncrementY = (int)(rect.Top + rect.Height / );  
        //Make the cursor position to the element.  
        SetCursorPos(IncrementX, IncrementY);  
        //Make the left mouse down and up.  
        mouse\_event(MOUSEEVENTF\_LEFTDOWN, IncrementX, IncrementY, , UIntPtr.Zero);  
        mouse\_event(MOUSEEVENTF\_LEFTUP, IncrementX, IncrementY, , 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 = ;  
        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 > )  
            {  
                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  
}  

}