控制第三方软件自动填充信息C/S

本文介绍了一个用于控制第三方软件自动填充信息的功能模块,通过两种方式实现:一是通过空标题控件自动填充信息;二是通过控制焦点跳转进行自动填充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/************控制第三方软件自动填充信息__功能模块************/
//描述:**系统
//功能:控制第三方程序修改
//开发者:帝者师
//开发时间:2013.12.12
/************控制第三方软件自动填充信息__功能模块************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace SendMessage
{
    public class CSendMessage
    {
        //==============================================================================================
        #region Members成员变量
        private int id;
        private const int WM_SETTEXT = 0x000C;
        private const int SW_NORMAL = 1;
        private const int GWL_ID = -12;
        #endregion Members成员变量
        //----------------------------------------------------------------------------------------------
        #region DLL
        //API声明:发送消息
        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        public static extern bool SendMessage(IntPtr hwnd, int msg, IntPtr wParam, string lParam);
        //API声明:根据Title获得窗体句柄
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
        //API声明:枚举窗体句柄包含的子控件句柄
        [DllImport("user32.dll", EntryPoint = "EnumChildWindows")]
        public static extern int EnumChildWindows(IntPtr hWndParent, CallBack lpfn, int lParam);
        public delegate bool CallBack(IntPtr hwnd1, int lParam);
        //API声明:获得句柄的标题
        [DllImport("user32.dll", EntryPoint = "GetWindowText")]
        public static extern int GetWindowText(IntPtr hwnd, StringBuilder lpString, int cch);
        //API声明:焦点跳转
        [DllImport("user32.dll", EntryPoint = "GetNextDlgTabItem")]
        static extern IntPtr GetNextDlgTabItem(IntPtr hDlg, IntPtr hCtl, bool bPrevious);
        //API声明:显示窗体
        [DllImport("USER32.DLL", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        private static extern int ShowWindow(IntPtr hWnd,int nCmdShow);
        //API声明:获得焦点
        [DllImport("USER32.DLL", EntryPoint = "SetForegroundWindow", CharSet = CharSet.Auto)]
        private static extern bool SetForegroundWindow(System.IntPtr hWnd);
        //API声明:获取进程ID 
        [DllImport("User32.dll", EntryPoint = "GetWindowThreadProcessId", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, IntPtr ID);
        ////API声明:进程共享
        [DllImport("user32.dll", EntryPoint = "AttachThreadInput")]
        private static extern int AttachThreadInput(int idAttach, int idAttachTo, int fAttach);
        //API声明:获取当前焦点控件句柄      
        [DllImport("user32.dll", EntryPoint = "GetFocus", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
        internal static extern IntPtr GetFocus();
        #endregion DLL
        //==============================================================================================
        #region Constructors构造函数
        public CSendMessage()
        {
            id = AppDomain.GetCurrentThreadId();
        }
        #endregion Constructors构造函数
        //----------------------------------------------------------------------------------------------
        #region PublicMethods公有方法
        /// <summary>
        /// 通过控件标题为空,自动填充信息
        /// </summary>
        /// <param name="formName">窗体标题</param>
        /// <param name="cindex">按输入内容的控件句柄顺序</param>
        /// <param name="tvalue">输入内容</param>
        /// <param name="separator">分隔符</param>
        /// <returns>是否发送成功</returns>
        public bool sendOutTitle(string formName, string cindex, string tvalue, char separator)
        {
            IntPtr hwnd;
            string[] sCtrIndex = cindex.Split(separator);
            string[] sTxtValue = tvalue.Split(separator);
            int[]nCtrIndex=new int[sCtrIndex.Length];
            for (int i = 0; i < sCtrIndex.Length; i++)
            {
                nCtrIndex[i] = Convert.ToInt32(sCtrIndex[i]);
            }      
            if (nCtrIndex.Length == sTxtValue.Length)
            {
            }
            else
            {
                Console.WriteLine("控件句柄顺序个数与填充控件个数不一致");
                return false;
            }
            hwnd = FindWindow(null, formName);//获取窗体的句柄,
            if (hwnd != IntPtr.Zero)
            {
                ShowWindow(hwnd, SW_NORMAL);
                SetForegroundWindow(hwnd);
                try
                {
                    List<IntPtr> listWnd = new List<IntPtr>();
                    EnumChildWindows(hwnd, new CallBack(delegate(IntPtr hwnd1, int lParam)
                    {
                        StringBuilder title = new StringBuilder(256);
                        GetWindowText(hwnd1, title, title.Capacity);//得到窗口的标题
                        if (title.Length == 0)
                        {
                            listWnd.Add(hwnd1);
                        }
                        return true;
                    }), 0);
                    for (int i = 0; i < nCtrIndex.Length; i++)
                    {
                        SendMessage(listWnd[nCtrIndex[i]], WM_SETTEXT, IntPtr.Zero, sTxtValue[i].ToString());
                    }
                    return true;
                }
                catch
                {
                    Console.WriteLine("修改未成功!请重新打开填充窗体!");
                    return false;
                }
            }
            else
            {
                Console.WriteLine("输入窗体未打开!");
                return false;
            }
        }


        /// 通过控制焦点跳转,自动填充信息
        /// 说明:需要填充的控件的Text属性必须为空
        /// </summary>
        /// <param name="formName">窗体标题</param>
        /// <param name="cindex">焦点跳转的次数</param>
        /// <param name="tvalue">输入内容</param>
        /// <param name="separator">分隔符</param>
        /// <returns>是否发送成功</returns>
        public bool sendOutTab(string formName, string cindex, string tvalue, char separator)
        {
            IntPtr hwnd,childhwnd,childhwnd1,childhwnd2;
            string[] sCtrIndex = cindex.Split(separator);
            string[] sTxtValue = tvalue.Split(separator);
            int[] nCtrIndex = new int[sCtrIndex.Length];
            for (int i = 0; i < sCtrIndex.Length; i++)
            {
                nCtrIndex[i] = Convert.ToInt32(sCtrIndex[i]);
            }
            if (nCtrIndex.Length == sTxtValue.Length)
            {
            }
            else
            {
                Console.WriteLine("控件句柄顺序个数与填充控件个数不一致");
                return false;
            }
            hwnd = FindWindow(null, formName);//获取窗体的句柄,
            if (hwnd != IntPtr.Zero)
            {
                ShowWindow(hwnd, SW_NORMAL);
                SetForegroundWindow(hwnd);
                try
                {
                    int TID = GetWindowThreadProcessId(hwnd, IntPtr.Zero);
                    int f = AttachThreadInput(id, TID, 1);
                    childhwnd = GetFocus();
                    AttachThreadInput(id, TID, 0);
                    childhwnd1 = childhwnd;
                    for (int i = 0; i < nCtrIndex.Length; i++)
                    {
                        if (nCtrIndex[i] > 0)
                        {
                            childhwnd2 = ChangeTab(hwnd, childhwnd1, nCtrIndex[i]);
                            SendMessage(childhwnd2, WM_SETTEXT, IntPtr.Zero, sTxtValue[i].ToString());
                            childhwnd1 = childhwnd2;
                        }
                        else if (nCtrIndex[i] == 0)
                        {
                            SendMessage(childhwnd1, WM_SETTEXT, IntPtr.Zero, sTxtValue[i].ToString());
                        }
                        else
                        {
                            Console.WriteLine("你传的步数有错误!");
                            return false;
                        }
                    }
                }
                catch
                {
                    Console.WriteLine("修改未成功!请重新打开填充窗体!");
                    return false;
                }
               
            }
            else
            {
                Console.WriteLine("输入窗体未打开!");
                return false;
            }
            return true;
        }


        /// <summary>
        /// 焦点跳转
        /// 说明:每次跳转步数(C#中第一步为窗体显示时最开始获得焦点的控件,然后按控件句柄顺序跳转)
        /// </summary>
        /// <param name="hwnd">窗体句柄</param>
        /// <param name="childhwnd">控件句柄</param>
        /// <param name="stept">跳转步数</param>
        /// <returns>跳转后控件句柄</returns>
        private IntPtr ChangeTab(IntPtr hwnd,IntPtr childhwnd,int stept)
        {
            IntPtr childhwnd1, childhwnd2;
            childhwnd1 = childhwnd;
            for (int i = 1; i <= stept; i++)
            {
                childhwnd2 = GetNextDlgTabItem(hwnd, childhwnd1, false);
                childhwnd1 = childhwnd2;
            }
            return childhwnd1;
        }
        #endregion PublicMethods公有方法
    }

}

第一次写文章,还有许多不足之处,有什么不足之处,希望大家给指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值