C#桌面程序的项目,最终生成一个Demo.exe文件。
Demo.exe文件内有若干个窗体,窗体内有若干个控件。
现在有另一个程序想通过反射Demo.exe,获取Demo.exe内指定窗体内的所有控件(不知道Control.Name)。有没相关的Demo或者做过类似需求的朋友给点提示?

解决方案 »

  1.   


                Assembly asm = Assembly.LoadFile(@"exe路径");
                foreach (Type type in asm.GetTypes())
                {
                    if (type.IsSubclassOf(typeof(Form)))
                    {
                        Form f = Activator.CreateInstance(type) as Form;
                        if (f.Name == "窗口名称")
                        {
                            Control.ControlCollection collection = f.Controls;
                            foreach (Control c in collection)
                                Console.WriteLine(c.Name);
                        }
                    }
                }
      

  2.   

    我想你肯定是根据类型来找,不可能根据Name来查找.
    另外,不需要创建实例
    Assembly asm = Assembly.LoadFile(@"exe路径");
                foreach (Type type in asm.GetTypes())
                {
                    if (type.IsSubclassOf(typeof(Form)))
                    {
                        var fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                foreach (var field in fields)
                {
                    if (field.FieldType.IsSubclassOf(typeof(Control)))
                    {
                        Console.WriteLine(field.Name);
                    }
                }     
                     }
                }
      

  3.   

    贴的太乱了,还少写个类型名称判断,重贴一下.
                Assembly asm = Assembly.LoadFile(@"exe路径");
                foreach (Type type in asm.GetTypes())
                {
                    if (type.IsSubclassOf(typeof(Form)) && type.Name == "查找的类名")
                    {
                        var fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
                        foreach (var field in fields)
                        {
                            if (field.FieldType.IsSubclassOf(typeof(Control)))
                            {
                                Console.WriteLine(field.Name);
                            }
                        }
                    }
                }
      

  4.   

    这个得用那个WINDOWS API当年资QQ时就是用这种思路写的。
      

  5.   

    Win32 API: FindWindow/FindWindowEx
    http://msdn.microsoft.com/en-us/library/ms633499(v=vs.85).aspx
    http://msdn.microsoft.com/en-us/library/ms633500(v=vs.85).aspx