windows之UIAutomation鼠标操作

来源:互联网 发布:淘宝碧素堂面膜怎么样 编辑:程序博客网 时间:2024/06/04 17:48

UIAutomation鼠标操作

方法封装:

[Flags]enum MouseEventFlag : uint{   Move = 0x0001,      //移动鼠标   LeftDown = 0x0002,  //模仿鼠标左键按下   LeftUp = 0x0004,    //模仿鼠标左键抬起   RightDown = 0x0008, //模仿鼠标右键按下   RightUp = 0x0010,   //模仿鼠标右键抬起     MiddleDown = 0x0020, // 模仿鼠标中键抬起   MiddleUp = 0x0040,   // 模仿鼠标中键抬起   XDown = 0x0080,   XUp = 0x0100,   Wheel = 0x0800,   VirtualDesk = 0x4000,   Absolute = 0x8000      //标示是否采取绝对坐标 }// 根据对象坐标模拟鼠标点击操作public class MousexyOpera{   [DllImport("user32.dll")]   extern static bool SetCursorPos(int x, int y);   [DllImport("user32.dll")]   static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);   [DllImport("user32.dll")]   static extern byte MapVirtualKey(uint uCode, uint uMapType);   [DllImport("user32.dll")]   extern static void mouse_event(MouseEventFlag mouseEventFlag, int incrementX, int incrementY, uint data, UIntPtr extraInfo);   // 根据XY轴坐标点击左键   public static void ClickLeftMouse(int incrementX, int incrementY)   {      SetCursorPos(incrementX, incrementY);      mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, incrementX, incrementY, 0, UIntPtr.Zero);   }   // 根据XY轴坐标双击左键   public static void DoubleClickLeftMouse(int incrementX, int incrementY)   {      SetCursorPos(incrementX, incrementY);      mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, incrementX, incrementY, 0, UIntPtr.Zero);      mouse_event(MouseEventFlag.LeftDown | MouseEventFlag.LeftUp, incrementX, incrementY, 0, UIntPtr.Zero);   }   // 根据XY轴坐标点击右键   public static void ClickRightMouse(int incrementX, int incrementY)   {      SetCursorPos(incrementX, incrementY);      mouse_event(MouseEventFlag.RightDown | MouseEventFlag.RightUp, incrementX, incrementY, 0, UIntPtr.Zero);   }   // 根据XY轴坐标双击右键   public static void DoubleClickRightMouse(int incrementX, int incrementY)   {       SetCursorPos(incrementX, incrementY);       mouse_event(MouseEventFlag.RightDown | MouseEventFlag.RightUp, incrementX, incrementY, 0, UIntPtr.Zero);       mouse_event(MouseEventFlag.RightDown | MouseEventFlag.RightUp, incrementX, incrementY, 0, UIntPtr.Zero);    }}public class SimulateOpera{    [DllImport("user32.dll")]    extern static bool SetCursorPos(int x, int y);    [DllImport("user32.dll")]    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);    [DllImport("user32.dll")]    static extern byte MapVirtualKey(uint uCode, uint uMapType);    [DllImport("user32.dll")]    extern static void mouse_event(MouseEventFlag mouseEventFlag, int incrementX, int incrementY, uint data, UIntPtr extraInfo);    //调用pattern点击一个botton    static public void InvokeBtn(AutomationElement ae)    {       InvokePattern ivkp = (InvokePattern)ae.GetCurrentPattern(InvokePattern.Pattern);       ivkp.Invoke();    }    // 根据图片等对象用鼠标左键点击该对象    public static void ClickImage(AutomationElement ae)    {        Rect rect = ae.Current.BoundingRectangle;        int incrementX = (int)(rect.Left + rect.Width / 2);        int incrementY = (int)(rect.Top + rect.Height / 2);        SetCursorPos(incrementX, incrementY);        MousexyOpera.ClickLeftMouse(incrementX, incrementY);    }    // 根据图片等对象用鼠标左键双击该对象    public static void DoubleClickImage(AutomationElement ae)    {        Rect rect = ae.Current.BoundingRectangle;        int incrementX = (int)(rect.Left + rect.Width / 2);        int incrementY = (int)(rect.Top + rect.Height / 2);        SetCursorPos(incrementX, incrementY);        MousexyOpera.DoubleClickLeftMouse(incrementX, incrementY);    }    // 根据起始和终点元素拖拽对象    static public void DragElement(AutomationElement aeStart, AutomationElement aeEnd)    {       Rect rectS = aeStart.Current.BoundingRectangle;       int incrementSx = (int)(rectS.Left + rectS.Width / 2);       int incrementSy = (int)(rectS.Top + rectS.Height / 2);       Rect rectE = aeEnd.Current.BoundingRectangle;       int incrementEx = (int)(rectE.Left + rectE.Width / 2);       int incrementEy = (int)(rectE.Top + rectE.Height / 2);       SetCursorPos(incrementSx, incrementSy);       Thread.Sleep(300);       mouse_event(MouseEventFlag.LeftDown, incrementSx, incrementSy, 0, UIntPtr.Zero);       Thread.Sleep(300);       SetCursorPos(incrementEx, incrementEy);       mouse_event(MouseEventFlag.LeftUp, incrementEx, incrementEy, 0, UIntPtr.Zero);    }    // 根据起始和终点坐标拖拽对象    public static void DragElementByPosition(int xStart, int yStart, int xEnd, int yEnd)    {        SetCursorPos(xStart, yStart);        Thread.Sleep(300);        mouse_event(MouseEventFlag.LeftDown, xStart, yStart, 0, UIntPtr.Zero);        Thread.Sleep(300);        SetCursorPos(xEnd, yEnd);        mouse_event(MouseEventFlag.LeftUp, xEnd, yEnd, 0, UIntPtr.Zero);   }    // 设置文本输入框的值    public static void SetEditorValue(AutomationElement aeEdit, string str)    {       ValuePattern vpt = (ValuePattern)aeEdit.GetCurrentPattern(ValuePattern.Pattern);       vpt.SetValue(str);    }}public class KeyboradOpera{    [DllImport("user32.dll")]    extern static bool SetCursorPos(int x, int y);    [DllImport("user32.dll")]    static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);    [DllImport("user32.dll")]    static extern byte MapVirtualKey(uint uCode, uint uMapType);    [DllImport("user32.dll")]    extern static void mouse_event(MouseEventFlag mouseEventFlag, int incrementX, int incrementY, uint data, UIntPtr extraInfo);    public static void SendKey(bool bDown, byte key)    {       if (!bDown)       {           keybd_event(key, MapVirtualKey(key, 0), 0x2, 0);       }       else       {           keybd_event(key, MapVirtualKey(key, 0), 0, 0);       }   }}

调用:

// 点击主界面的菜单按钮public static bool menuBtnClick(){    OperateObject.mainwin = GetObject.GetMainWindow();    AutomationElement menuBtn = GetObject.GetMenuBtn(OperateObject.mainwin);    if (menuBtn == null)    {        return false;    }    else    {        SimulateOpera.InvokeBtn(menuBtn);        AutomationElement menuWin = GetObject.GetMenuWin(OperateObject.mainwin);        if (menuWin == null)        {            return false;         }         return true;     }}//设置保存窗口的输入框的值public static bool SetSaveFileName(String fileName){    OperateObject.mainwin = GetObject.GetMainWindow();    OperateObject.popSaveWin = GetObject.GetPopSaveWin(OperateObject.mainwin);    if (OperateObject.popSaveWin == null)    {        return false;     }     AutomationElement TextField = GetObject.GetSaveTextField(OperateObject.popSaveWin);     if (TextField == null)     {         return false;     }     else     {         SimulateOpera.SetEditorValue(TextField, fileName);         return true;      }}
原创粉丝点击