如题,我是比较希望能做到截获所有的文字输出的一个通用的办法。当然,这个delphi的source是我自己的。
大家可以把你们实现的方法说出来听听看,我之前有做了个直接修改controls.pas,结果这样似乎只可以截那些caption属性,其他的,如listbox中的那些就截不到。大家帮帮忙,想想办法,谢谢!

解决方案 »

  1.   

    1.可以用getwindowtext API 取得部分控件的text.
    2.彻底的方法是如楼上所说,截获 textout 等一些文字输出的API,类似金山词霸取词功能. 这要用到 hook , 远程代码注射,引入表修改等技术.你可以按这些线索网上找找,应该有你要的内容。
      

  2.   

    问一下1、2楼,用hook截这些API我也会的,但是我搞不清楚,这些textout等类似的方法究竟有多少个,一个我怕做的不全,再个就是觉得,我有source的情况下,可否有一些稍微文明点方式(不需要用hook,有些系统监测软件会档掉。)来实现这个方法?拜托各位多多出主意,问题解决后,定当厚分相送!
      

  3.   

    我有个想法但不知行不行,因为你有source ,那么取text的代码应该和被取者是在同一进程里的,那通过枚举窗体(包括窗体内所有控件),根据不同的classname转换成对应delphi的类,在取它的属性值...
      

  4.   

    to fangkailove你的这个办法我们现在就是在用,是用在多国语言的设计里,但是这样做有一个坏处就是,我必须事先知道各个窗体中所有的元件,而我们这个多国语言通常一用就会是在整个一个大的系统工程中,这里面会设计到30多个的模块程序,20多位程序员的工作,我不能确认他们在以后的设计里是否会用到一些第三方组件等等,所以现在才出现了枚举的弊端呀,有些不是我们底层现在就可以预见到的元件在这里面,所以我们在想改良方案,我原本是想直接更新了VCL的基类,但是后来发现有些元件如listbox等,这里是用items来储存的,这样也还是无异与枚举了,我需要修改太多的VCL的pas文件了,于是我想找出VCL中可以直接将文字画到屏幕的地方,在这里来动态翻译,可结果追进了windows API了,比较郁闷呀。大家再帮我想想办法呢。拜托啦^_^
      

  5.   

    问题已解,用的是EXE中的hook,不过效果真的不咋的,速度有点慢,词典太大了点,郁闷。今天晚上-明天早上结贴。有主意再来说上两句呀
      

  6.   

    在Hook中不要做太多操作,尤其是费时的,这样整个系统都会很慢的。
      

  7.   

    结啦,感谢各位协助。
    公司最近要换.net了,郁闷中,虽然我社么语言都OK,但还是感觉Delphi比较爽。
    ^_^
      

  8.   

    这个没必要用 hook, 放一个ApplicationEvent就可以,判断 WM_SETTEXT, LPARAM 就是指向 lpsz 的一个指针
      

  9.   

    像 ListBox 之类的他用的是不同的消息, 你要做一个区分
    ListBox 是 LB_ADDSTRING, LPARAM 同样是一个 lpsz str
    ComboBox 是 CB_ADDSTRING, LPARAM 同样
      

  10.   

    ApplicationEvent OnMessage事件如下
    .ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);tagMSG = TMsg 如下定义
      TMsg = packed record
        hwnd: HWND;
        message: UINT;
        wParam: WPARAM;
        lParam: LPARAM;
        time: DWORD;
        pt: TPoint;  end;其中 message 取出跟 WM_SETTEXT, LB_ADDSTRING 判断