天天看點

C#操作鍵盤滑鼠

类名:JuBingHelper.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;

namespace Upload4GW.Helper
{
    public enum MouseEventFlags
    {
        Move = 0x0001, //移动鼠标
        LeftDown = 0x0002,//模拟鼠标左键按下
        LeftUp = 0x0004,//模拟鼠标左键抬起
        RightDown = 0x0008,//鼠标右键按下
        RightUp = 0x0010,//鼠标右键抬起
        MiddleDown = 0x0020,//鼠标中键按下 
        MiddleUp = 0x0040,//中键抬起
        Wheel = 0x0800,
        Absolute = 0x8000//标示是否采用绝对坐标
    }

    class JuBingHelper
    { //使用方法
        //控件函数.窗口拖动(this.button1,this);
        //控件函数.控件拖动(this.button2);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
        /// <summary>
        ///  //根据坐标点获取句柄
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(Point p);
        /// <summary>
        ///  //获取窗口标题
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="lpString"></param>
        /// <param name="nMaxCount"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int nMaxCount);
        /// <summary>
        /// //获取句柄类名
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="s"></param>
        /// <param name="nMaxCount"></param>
        [DllImport("user32.dll")]
        private static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);
        /// <summary>
        /// //获取句柄父句柄
        /// </summary>
        /// <param name="hwnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern IntPtr GetParent(IntPtr hwnd);
        /// <summary>
        /// //设置父句柄
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="cwnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern IntPtr SetParent(IntPtr hwnd, IntPtr cwnd);
        /// <summary>
        /// //获取句柄矩形位置信息
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="lpRECT"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(IntPtr hwnd, ref RECT lpRECT);   //获取句柄矩形位置信息

        [DllImport("User32")]
        public extern static void SetCursorPos(int x, int y);
        [DllImport("User32")]
        public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);

        [StructLayout(LayoutKind.Sequential)]
        public struct 句柄信息结构体
        {
            public Rectangle 位置;
            public string 密文显示;
            public string 类名;
            public List<IntPtr> 父窗句柄;
            public List<string> 父窗标题;
            public List<string> 父窗类名;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        public static 句柄信息结构体 获取句柄信息(IntPtr 句柄)
        {
            句柄信息结构体 xinxi = new 句柄信息结构体();
            xinxi.父窗句柄 = new List<IntPtr>();
            xinxi.父窗标题 = new List<string>();
            xinxi.父窗类名 = new List<string>();
            RECT weizhi = new RECT();
            GetWindowRect(句柄, ref weizhi);
            xinxi.位置.X = weizhi.Left;
            xinxi.位置.Y = weizhi.Top;
            xinxi.位置.Width = weizhi.Right - weizhi.Left;
            xinxi.位置.Height = weizhi.Bottom - weizhi.Top;
            StringBuilder s = new StringBuilder(512);
            string ss = GetTextBoxInfo(句柄);
            xinxi.密文显示 = ss.ToString();
            GetClassName(句柄, s, s.Capacity);
            xinxi.类名 = s.ToString();

            IntPtr f1 = GetParent(句柄);
            IntPtr h;
            while (f1 != IntPtr.Zero)
            {
                xinxi.父窗句柄.Add(f1);
                StringBuilder s1 = new StringBuilder(512);
                GetWindowText(f1, s1, s1.Capacity);
                xinxi.父窗标题.Add(s1.ToString());
                GetClassName(f1, s1, s1.Capacity);
                xinxi.父窗类名.Add(s1.ToString());
                h = f1;
                f1 = GetParent(h);
            }
            return xinxi;
        }
        /// <summary>
        ///    //寻找目标进程窗口
        /// </summary>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName">窗体名称</param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        /// <summary>
        ///hwndparent为0表示桌面为父,hwndchildafter为null表示从第一个开始,lpwindowname为null表示步匹配该项
        /// </summary>
        /// <param name="hwndParent"></param>
        /// <param name="hwndChildAfter"></param>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);

        /// <summary>
        ///  设置进程窗口到最前   
        /// </summary>
        /// <param name="hWnd"></param>
        /// <returns></returns>
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
        //模拟键盘事件         
        [DllImport("USER32.DLL")]
        public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);
        public delegate bool CallBack(IntPtr hwnd, int lParam);
        [DllImport("USER32.DLL")]
        public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);

        //给CheckBox发送信息
        [DllImport("USER32.DLL", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, UInt32 wMsg, int wParam, int lParam);

        /// <summary>
        ///   给Text发送信息
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="Msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("USER32.DLL", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, string lParam);
        [DllImport("USER32.DLL")]
        public static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);
        /// <summary>
        /// 讲信息发送给句柄对应的空间中
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="Msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, StringBuilder lParam);

        /// <summary>
        /// 发送操作信息
        /// </summary>
        /// <param name="hwnd">索要操作空间的句柄</param>
        /// <param name="Msg">操作类型</param>
        /// <param name="wParam">索要操作空间的句柄</param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "SendMessageA")]
        public static extern int SendMessageA(IntPtr hwnd, int Msg, IntPtr wParam, int lParam);
        /// <summary>
        /// 设置空间焦点
        /// </summary>
        /// <param name="hWnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern IntPtr SetFocus(IntPtr hWnd);



        /// <summary>
        /// 获取 句柄对应控件的值
        /// </summary>
        /// <param name="hWnd32"></param>
        /// <returns></returns>
        public static string GetTextBoxInfo(IntPtr hWnd32)
        {
            const int WM_GETTEXT = 0x000D;
            IntPtr wParam = new IntPtr(100);
            StringBuilder ret = new StringBuilder(256);
            SendMessage(hWnd32, WM_GETTEXT, wParam, ret);
            return ret.ToString();
        }
        /// <summary>
        /// 设置 句柄对应控件的值
        /// </summary>
        /// <param name="hWnd32">句柄的值</param>
        /// <param name="result">索要传输的值</param>
        /// <returns></returns>
        public static bool SetTextBoxInfo(IntPtr hWnd32, string result)
        {
            if (hWnd32 == IntPtr.Zero)
            {
                return false;
            }
            const int WM_SETTEXT = 0x000C;
            IntPtr wParam = new IntPtr(100);
            StringBuilder ret = new StringBuilder(256);
            SendMessage(hWnd32, WM_SETTEXT, IntPtr.Zero, result);
            return true;
        }


        /// <summary>
        ///    //查找控件句柄
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="classname"></param>
        /// <param name="text"></param>
        /// <returns></returns>
        public static IntPtr Findview(IntPtr parent, string classname, string text)
        {
            IntPtr hwndtemp = FindWindowEx(parent, IntPtr.Zero, classname, text);
            if (hwndtemp == IntPtr.Zero)
            {
                List<IntPtr> allchild = Findallchild(parent);
                for (int i = 0; i < allchild.Count; i++)
                {
                    句柄信息结构体 ju = 获取句柄信息(allchild[i]);
                    if (ju.类名 == classname && ju.密文显示 == text)
                    {
                        return allchild[i];
                    }
                }
            }
            return hwndtemp;
        }


        /// <summary>
        ///  查找子内容
        /// </summary>
        /// <param name="parent"></param>
        /// <returns></returns>
        public static IntPtr Findview(IntPtr parent)
        {
            IntPtr hwndtemp = FindWindowEx(parent, IntPtr.Zero, null, null);

            return hwndtemp;
        }
        /// <summary>
        /// 查找一级子控件句柄
        /// </summary>
        /// <param name="parent"></param>
        /// <returns></returns>
        public static List<IntPtr> Findchild(IntPtr parent)
        {
            List<IntPtr> allchild = new List<IntPtr>();
            IntPtr hwnd = FindWindowEx(parent, IntPtr.Zero, null, null);
            while (hwnd != IntPtr.Zero)
            {
                allchild.Add(hwnd);
                hwnd = FindWindowEx(parent, hwnd, null, null);
            }
            return allchild;
        }
        /// <summary>
        ///  //查找所有子控件-广度遍历
        /// </summary>
        /// <param name="parent"></param>
        /// <returns></returns>
        public static List<IntPtr> Findallchild(IntPtr parent)
        {
            List<IntPtr> allchild = new List<IntPtr>();
            allchild.Add(parent);   //第一个添加父句柄,最后再删除
            for (int i = 0; i < allchild.Count; i++)
            {
                IntPtr patenttemp = allchild[i];
                IntPtr hwnd = FindWindowEx(patenttemp, IntPtr.Zero, null, null);
                while (hwnd != IntPtr.Zero)
                {
                    allchild.Add(hwnd);
                    hwnd = FindWindowEx(patenttemp, hwnd, null, null);
                }
            }
            allchild.RemoveAt(0);
            return allchild;
        }

        /// <summary>
        /// 查找窗口
        /// </summary>
        /// <param name="classname"></param>
        /// <param name="windowname"></param>
        /// <returns></returns>
        public static IntPtr Findform(string classname, string windowname)
        {
            IntPtr hwnd = FindWindow(classname, windowname);
            return hwnd;
        }

        /// <summary>
        /// 模拟鼠标左键单击
        /// </summary>
        /// <param name="hwnd">传递所操作的句柄</param>
        /// <returns></returns>
        public static bool ClickControl(IntPtr hwnd)
        {
            if (hwnd == IntPtr.Zero)
            {
                return false;
            }

            SendMessageA(hwnd, 0x0201, hwnd, 0);
            SendMessageA(hwnd, 0x0202, hwnd, 0);
            return true;
        }

        public static void ButtonClick(String xPos, String yPos)
        {
            int x = Int32.Parse(xPos);
            int y = Int32.Parse(yPos);
            SetCursorPos(x, y);
            mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), x, y, 0, IntPtr.Zero);
            mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), x, y, 0, IntPtr.Zero);
        }

        /// <summary>
        /// 根据窗体标题获取窗体内容
        /// </summary>
        /// <param name="captionName"></param>
        /// <returns></returns>
        public static String GetWindowContentByCaptionName(String captionName)
        {           
            DateTime d1 = DateTime.Now;
            try
            {
                IntPtr systemInfo = IntPtr.Zero;
                while (systemInfo == IntPtr.Zero)
                {
                    DateTime d2 = DateTime.Now;
                    TimeSpan timeDiff = d2 - d1;
                    if (timeDiff.Seconds > 3)
                    {
                        return "";
                    }
                    Thread.Sleep(10);
                    systemInfo = FindWindow(null, captionName);
                }
                List<IntPtr> ptrList = JuBingHelper.Findchild(systemInfo);
                if (ptrList.Count == 3)
                {
                    StringBuilder sb = new StringBuilder();
                    JuBingHelper.句柄信息结构体 jubingInfo = JuBingHelper.获取句柄信息(ptrList[2]);
                    return jubingInfo.密文显示;
                }
            }
            catch { }
            return "";
        }

       /// <summary>
       /// 
       /// </summary>
       /// <param name="captionName"></param>
       /// <param name="timeout">超时时间</param>
       /// <returns></returns>
        public static IntPtr GetWindowAddress(String captionName,int timeout)
        {
            DateTime d1 = DateTime.Now;
            try
            {
                IntPtr systemInfo = IntPtr.Zero;
                while (systemInfo == IntPtr.Zero)
                {
                    DateTime d2 = DateTime.Now;
                    TimeSpan timeDiff = d2 - d1;
                    if (timeDiff.Seconds > timeout)
                    {
                        return IntPtr.Zero;
                    }
                    LogHelper.Info("find...:"+timeDiff.Seconds);
                    Thread.Sleep(10);
                    systemInfo = FindWindow(null, captionName);                   
                }
                return systemInfo;
            }
            catch { }
            return IntPtr.Zero;
        }

        /// <summary>
        /// 根据窗体标题获取窗体内容
        /// </summary>
        /// <param name="captionName"></param>
        /// <returns></returns>
        public static String GetWindowContentByAddress(IntPtr address)
        {
            DateTime d1 = DateTime.Now;
            try
            {
                List<IntPtr> ptrList = JuBingHelper.Findchild(address);
                LogHelper.Info("count:"+ptrList.Count);
                if (ptrList.Count == 3)
                {
                    StringBuilder sb = new StringBuilder();
                    JuBingHelper.句柄信息结构体 jubingInfo = JuBingHelper.获取句柄信息(ptrList[2]);
                    return jubingInfo.密文显示;
                }
            }
            catch { }
            return "";
        }

        /// <summary>
        /// 根据窗体标题判断是否存在窗体
        /// </summary>
        /// <param name="captionName"></param>
        /// <returns></returns>
        public static Boolean IsExistWindow(String captionName)
        {            
            DateTime d1 = DateTime.Now;
            try
            {
                IntPtr systemInfo = IntPtr.Zero;
                while (systemInfo == IntPtr.Zero)
                {
                    DateTime d2 = DateTime.Now;
                    TimeSpan timeDiff = d2 - d1;
                    if (timeDiff.Seconds > 2)
                    {
                        return false;
                    }
                    Thread.Sleep(10);
                    systemInfo = FindWindow(null, captionName);
                }
                return true;
            }
            catch { }
            return false;

        }

        public static void CloseWindowByAddress(IntPtr address)
        {
            SendMessage(address, 0x0010, IntPtr.Zero, null);
            Thread.Sleep(PublicConfig.时间_点击事件等待);
        }

        /// <summary>
        /// 是否存在Windows
        /// </summary>
        /// <param name="className"></param>
        /// <param name="lpclassName"></param>
        /// <returns></returns>
        public static Boolean IsExistWindow(String className,String lpclassName)
        {
            DateTime d1 = DateTime.Now;
            IntPtr gwMainForm = IntPtr.Zero;
            while (gwMainForm == IntPtr.Zero)
            {
                DateTime d2 = DateTime.Now;
                TimeSpan timeDiff = d2 - d1;
                if (timeDiff.Seconds > 2)
                {
                    return false;
                }
                Thread.Sleep(10);
                gwMainForm = FindWindow(className, null);
            }

            IntPtr panel = FindWindowEx(gwMainForm, IntPtr.Zero, lpclassName, null);

            return !(panel == IntPtr.Zero);
        }
    }
}
           
c#