大家好,我是赤道上的小熊,最近在做一个二开设计平台,要实现遍历某EXE中的所有窗体以及窗体上的控件,下面的实现方式不仅可以找到窗体中已经存在的控件,通过程序动态创建的控件也可以遍历到(例如:Button button2 = new Button()),希望对大家所有帮助。
- PS:该实现方式必须和要寻找的窗体在同一项目中
//获取EXE中的控件值
string strRes = "";
private void GetControls()
{
strRes = "";
System.Reflection.Assembly ase = System.Reflection.Assembly.LoadFile(Application.ExecutablePath);//.net中的反射 Application.ExecutablePath exe所在路径
Type[] types = ase.GetTypes();
foreach (Type item in types) //获取程序中的form窗体
{
if (item.BaseType.Name == "Form") //寻找类型为Form
{
init("frmDemo", "frmDemo." + item.Name);
}
}
MessageBox.Show(strRes, "");
}
/// <summary>
/// 获取窗体中的控件
/// </summary>
/// <param name="strNameSpace">命名空间</param>
/// <param name="strNameSpaceFormID">命名空间.窗体ID</param>
private void init(string strNameSpace, string strNameSpaceFormID)
{
Form childForm = (Form)System.Reflection.Assembly.Load(strNameSpace).CreateInstance(strNameSpaceFormID);
foreach (Control item in childForm.Controls) //循环窗体中的控件
{
if (item is TextBox)
{
TextBox txtbox = (TextBox)item;
strRes = strRes + childForm.Name.ToString() + "—" + txtbox.Name.ToString() + " ";
}
if (item is Button)
{
Button btn = (Button)item;
strRes = strRes + childForm.Name.ToString() + "—" + btn.Name.ToString() + " ";
}
if (item is ComboBox)
{
ComboBox com = (ComboBox)item;
strRes = strRes + childForm.Name.ToString() + "—" + com.Name.ToString() + " ";
}
}
}