/************控制第三方软件自动填充信息__功能模块************/
//描述:**系统
//功能:控制第三方程序修改
//开发者:帝者师
//开发时间: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公有方法
}
//描述:**系统
//功能:控制第三方程序修改
//开发者:帝者师
//开发时间: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公有方法
}
}
第一次写文章,还有许多不足之处,有什么不足之处,希望大家给指出。