通过反射设置其它进程窗口的属性和调用方法无效。

崔作非 2013-11-14 05:16:04
获取其它进程的属性值,可以得到。
Pvalue=TF.Reflection_Get_Property(@"..\..\..\WindowsFormsUI\bin\Release\" + filemainname + ".exe", "WindowsFormsUI.Form4", "Text", null);

public Object Reflection_Get_Property(string Path, string NameSpaceAndClassName, string PropertyName,object[] index)
{

Assembly Ass = Assembly.LoadFrom(Path);
Type TP = Ass.GetType(NameSpaceAndClassName);
PropertyInfo PI = TP.GetProperty(PropertyName);
object MeObj = System.Activator.CreateInstance(TP);
return PI.GetValue(MeObj, index);

}
类似的代码但设置值无效。
TF.Reflection_Set_Property(@"..\..\..\WindowsFormsUI\bin\Release\" + filemainname + ".exe", "WindowsFormsUI.Form4", "Text", "Form(4)", null);

public int Reflection_Set_Property(string Path, string NameSpaceAndClassName, string PropertyName, object value,object [] index)
{

Assembly Ass = Assembly.LoadFrom(Path);
Type TP = Ass.GetType(NameSpaceAndClassName);
PropertyInfo PI = TP.GetProperty(PropertyName);
object MeObj = System.Activator.CreateInstance(TP);
PI.SetValue(MeObj, value, index);
return 0;
}
反射调用其它窗口的方法,执行了但窗口没有效果。
TF.Reflection_Call_Method(@"..\..\..\WindowsFormsUI\bin\Release\" + filemainname + ".exe", "WindowsFormsUI.Form4", "TestAdd2", new object[]{100,30});

public int Reflection_Call_Method(string Path, string NameSpaceAndClassName, string MethodName, object[] Parameters)
{

Assembly Ass = Assembly.LoadFrom(Path);
Type TP = Ass.GetType(NameSpaceAndClassName);
MethodInfo MI = TP.GetMethod(MethodName);
object MeObj = System.Activator.CreateInstance(TP);
MI.Invoke(MeObj, Parameters);
return 0;
}

被反射调用的代码
public void TestAdd2(int a,int b)
{
int c;
c = a + b;
this.label1.Text = c.ToString();
this.label1.Show();//通过界面调用可以得到结果,通过反射调用窗口label未改变
Console.WriteLine(c);//通过反射调用可以得到结果
}

整个执行过程无异常报错,只是窗口的属性值未改变,求助大家,反射刚开始学,很多东东还不会,谢谢!
...全文
359 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
崔作非 2013-11-18
  • 打赏
  • 举报
回复
静态方法没有问题,再问一下InvokeMember怎么得到一个类实例作为返回值呢?
崔作非 2013-11-18
  • 打赏
  • 举报
回复
改用ManagedSpy了,组件属性可以读写了,方法再试试,先结贴吧。
崔作非 2013-11-15
  • 打赏
  • 举报
回复
上面那个错误解决了。 发现和我之前写的反射代码的绑定条件不一样,增加了一个BindingFlags::Instance条件,不报那个错了。 Object^ retVal = type->InvokeMember(msg->MethodName, BindingFlags::Static | BindingFlags::Public | BindingFlags::InvokeMethod |BindingFlags::Instance , nullptr, nullptr, msg->Args); 现在报非静态方法需要一个目标的错误。
崔作非 2013-11-15
  • 打赏
  • 举报
回复
感谢楼上的朋友,我现在用的是另一个,.NET Object Spy 原理差不多。 http://www.codeproject.com/Articles/16481/NET-Object-Spy-and-InvokeRemote 封装了一个方法 object Injector.InvokeRemote(IntPtr hWnd, string assemblyFile, string typeName, string methodName, object[] args) 我的代码 element = TF.Find(childformelement, "Form4", ""); Injector.InvokeRemote((System.IntPtr)element.Current.NativeWindowHandle, @"..\..\..\..\WindowsFormsUI\bin\x86\Release\" + filemainname + ".exe", "WindowsFormsUI.Form4", "TestAdd", null); 报异常提示说未找到方法WindowsFormsUI.Form4.TestAdd,很奇怪的问题。 用spy++看了一下,异常窗口是WindowsFormsUI报的,说明注入成功了。
threenewbee 2013-11-14
  • 打赏
  • 举报
回复
http://www.vckbase.com/index.php/wv/1340.html ManagedSpy是写在一个名为ManagedSpyLib的托管C++库上的。ManagedSpyLib的目标是允许在另一个进程中按计划访问基于.NET Framework的窗体。ManagedSpyLib暴露了一个名为ControlProxy的类,它代表了在另一个进程中的一个控件。虽然它不是一个实际的控件,你可以访问它代表的所有属性和事件。 ManagedSpyLib用一个内存映射(memory-mapped)文件在窥探和被窥探进程之间传递数据而起作用。
崔作非 2013-11-14
  • 打赏
  • 举报
回复
好的,谢了,试了一下这个反射相当于创建了一个类实例,反射操作后的东东都在新的实例中,对来的的实例不起作用,之前获得的属性也是构造函数初化后的值,也不能得到最新窗口的信息,其实就是一静态反编译。 我再试试进程注入。
clark523 2013-11-14
  • 打赏
  • 举报
回复
反射可以操作private set,private method.但是不代表你set了以后就会产生效果。 要知道一个进程操作另外一个进程必须采用注入的方式。
cheng2005 2013-11-14
  • 打赏
  • 举报
回复
谁告诉你反射可以做这个事的?直接大嘴巴子抽他,使劲抽,手没受伤就别停。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧