使用ManagedSpyLib监视.net程序中控件属性的变化
手头的需求是这样的:
现有一个.net程序,界面上某个控件的Text属性值会变化,需要另外写一个程序去监视这个值的变化。
如果是个C++程序员,这个需求一定很简单,挂上钩子就OK了。
不过我想用.net程序实现。
在拜了无数遍Google大神之后,我找到了这个东西—ManagedSpy,这个东西有个类库ManagedSpyLib是托管C++写的,其中有个类叫做ControlProxy,作用就是允许你访问其他进程中的控件。
有这么好的东西就先拿来试试,看看能不能达到我们的需求。
实验步骤如下:
准备一个程序,来表示界面上某个控件Text属性的变化,这就很简单了,窗体上拖个按钮,每按一次按钮,窗体的Text值就会自加1。

嘿嘿,已经按了很多次了
接下来依葫芦画瓢,根据那个ManagedSpy中的例子,自己写个程序调用ManagedSpyLib中的方法来实现开头的功能。

界面很简单,按“开始记录”就会把Text的变化显示在下面的ListBox中
开始记录按钮的事件处理函数这样写:
IntPtr handle = IntPtr.Zero; //获取所有进程 Process[] processes = Process.GetProcesses(); //根据进程名字定位到需要监视的进程 foreach (Process process in processes.Where(process => process.ProcessName == "WindowsFormsApplication2")) { //拿到进程主窗体句柄 handle = process.MainWindowHandle; break; } //使用ControlProxy的方法取得主窗体实例 proxy = ControlProxy.FromHandle(handle); //根据实例中所有支持的事件的名字找到需要的事件订阅之 foreach(EventDescriptor ed in proxy.GetEvents().Cast<EventDescriptor>().Where(ed => ed.Name == "TextChanged")) { proxy.SubscribeEvent(ed); } //挂上事件处理函数 proxy.EventFired += ProxyEventFired;
光拿到事件还不行啊,我们必须得到属性值,所以事件处理函数ProxyEventFired中还要进行处理:
//使用GetValue方法可以很容易的办到这个事情
lbRecords.Items.Insert(0, proxy.GetValue("Text"));
浙公网安备 33010602011771号