要获得同一个进程中的某个win form 控件的字体(Font)或者获得其它进程中win32控件字体都已经解决了。
可是对于.Net的控件,我想要获得其它进程的某个win form控件的字体,尝试了很多方法都不行。
有没有高人给个idea?问题:
已知目标控件的hwnd,这个控件为winform控件(例如.Net的TextBox控件),这个控件属于其他程序要求:
获得这个控件的Font

解决方案 »

  1.   

    GetWindowThreadProcessId+OpenProcess+VirtualAllocEx+ReadProcessMemoryAPI的用法可以到www.pinvoke.net上面查
      

  2.   

    To misvcom(零下一度):
    多谢,这是一个我没有尝试过的办法,能不能具体点呢?
    我有了控件的hwnd,如何通过VirtualAllocEx+ReadProcessMemory 来获得字体呢?
      

  3.   

    广告
    JSP,ASP和ASP.NET朋友加入,一起研究学习之用!群号:13156076
      

  4.   

    To Knight94(愚翁):
    是用来测试其他程序中控件的文本的长度
    有了Font就能确定文本的Size了有人有什么其他的Idea吗?
      

  5.   

    我觉得大致思路应该如下:
    1.获得窗体句柄,调用FindWindow;
    2.获得控件句柄,可以调用EnumChildWindows;
    3.通过控件句柄获得hdc,可以调用GetHdc;
    4.通过hdc获得Font,调用GetFontData来获得。
      

  6.   

    对于win32的控件,我可以用SendMessage(hwnd,WM_GETFONT....)来得到目标控件的HFont,因为这个font被Device Context(DC)选中。而对于winform的控件,SendMessage(hwnd,WM_GETFONT....)返回null,我没有看过.net的源码,不过我觉得像类似Button(.net控件)这类控件,把Font对象作为一个member,而没有让控件的DC选中这个font,而在Graphics->DrawString的时候把Font传给DrawString函数,因此SendMessage的方法就行不通了。另外因为是2个进程,要得到另一个进程中控件的member信息,不是件容易的事情。通过GetWindowThreadProcessId+OpenProcess+VirtualAllocEx+ReadProcessMemory可能可以得到font的Handle,不过我不知道怎么根据一个控件的hwnd,来定位到这个控件的Font member。别的我能想到的办法就是hook了,不过我也不清楚怎么简单的hook .Net的DrawString函数有没有高人有办法?
      

  7.   

    To Knight94(愚翁):
    谢谢你的帮助,不过对于WinForm控件,无法根据hdc得到font :)  只能试试其它办法了
      

  8.   

    To Knight94(愚翁):
    我通过得到其他应用程序控件上文本的长度,来判断是否有文本因为控件本身的长度而没有被显示出来
      

  9.   

    那么如果是winform窗体,即.net环境下的,你可以通过反射去找某个控件的Font属性。
      

  10.   

    To Knight94(愚翁):
    如果在同一个进程中,这个方法是可以的,不过不同进程就不能用反射了吧?
      

  11.   

    to 如果在同一个进程中,这个方法是可以的,不过不同进程就不能用反射了吧?why?
    是没有问题,要不然怎么可能有反编译工具。
      

  12.   

    Read detail info about "Assembly" class in msdn.
      

  13.   

    哦,前面理解错你意思了
    原来你是说把整个exe文件用反射来分析?不过我在程序运行中,只知道某个目标控件的hwnd,这样如何在assembly中定位到这个资源?
    况且目标程序在运行中可能改变控件的Font属性,光读原始exe文件是无法知道目前的Font状态的,对不对?
      

  14.   

    to 原来你是说把整个exe文件用反射来分析?
    是的
      

  15.   

    to 不过我在程序运行中,只知道某个目标控件的hwnd,这样如何在assembly中定位到这个资源?
    况且目标程序在运行中可能改变控件的Font属性,光读原始exe文件是无法知道目前的Font状态的,对不对?前面部分是没有什么问题,但是我没有考虑到后半部分,有可能调用某个特定的函数去修改Font属性。
      

  16.   

    另外 我现在能想到的办法:1. 通过ReadProcessMemory来读取目标控件的HFont,不过不知道如何根据控件的hwnd来定位到内存地址2. 用Hook来hook GDIPlus的DrawString函数,通过分析传进来的Font对象来确定文本大小,这样做非常复杂,有其它办法的话尽量不用3. 如果.Net控件Draw文本不是用gdiPlus的函数,而是有其他方法,可能还有其他方法可以获得font大家有没有主意?
      

  17.   

    建议使用ManagedSpy,并且提供2次开发,很强。完全能够满足你的需要。
    http://www.vckbase.com/document/viewdoc/?id=1625
      

  18.   

    你可以下载ManagedSpy的源代码,查看其实现原理。当然也有文章。