zoukankan      html  css  js  c++  java
  • 使用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"));

    程序写完了,根据运行结果,完全可以实现我们的需求。

    PSManagedSpyLib是托管C++写的,理论上完全可以转化为C#代码,不过现在还没有时间,以后再弄吧。

    其实我上面写的那些东西在这里都已经写的很清楚了,我只不过是取了其中的部分用法写了这篇文章。

  • 相关阅读:
    bash帮助文档简单学习;bash手册翻译
    jmeter的master、slave模型启动方法
    如何查看pip安装包的所有版本;以及ipython的安装
    简单过下bash/sh脚本基本知识吧
    Celery 启动报错 can_read() got an unexpected keyword argument timeout
    paramiko执行命令超时的问题
    远程的jmeter自动执行完,如何回调通知被调用者“结束”状态
    记录一下:关于mysql数据误删除恢复的问题
    数据库Sharding的基本思想和切分策略
    数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
  • 原文地址:https://www.cnblogs.com/mobydick/p/1688971.html
Copyright © 2011-2022 走看看