用GetWindowText,在APIViewer里找,
3个参数如下:
hWnd,你要获得文本的窗体的句柄(进)
lpstring,返回的文本(出)
nMaxCount,允许复制到缓存里的字符的个数(进)

解决方案 »

  1.   

    GetWindowText 得到的是窗口的标题,根本不是床体显示的文本
      

  2.   

    API HOOK 请说具体点好吗??
      

  3.   

    API是需要的
    但是与屏幕取词这个核心功能直接间接相关的
    绝对没有!
      

  4.   

    想了解API HOOK技术的话,请看Jeffrey Richter大牛的《Windows 核心编程》,从545页开始……
      

  5.   


    原来如此,看不懂呀
    浅谈API HOOK技术(一)
    APIHook一直是使大家感兴趣的话题。屏幕取词,内码转化,屏幕翻译,中文平台等等都涉及到了此项技术。有很多文章涉及到了这项技术,但都闪烁其词不肯明明白白的公布。我仅在这里公布以下我用Delphi制作APIHook的一些心得。 
    通常的APIHOOK有这样几种方法: 
    1、自己写一个动态链接库,里面定义自己写的想取代系统的API。把这个动态链接库映射到2G以上的系统动态链接库所在空间,把系统动态链接库中的该API的指向修改指向自己的函数。这种方法的好处就是可以取代系统中运行全部程序的该API。但他有个局限,就是只适用于Win9x。(原因是NT中动态链接库不是共享的,每个进程都有自己的一份动态链接库在内存中的映射) 
    2、自己写一个动态链接库,里面定义自己写得象替代系统的API。把这个动态链接库映射到进程的空间里。将该进程对API的调用指向自己写的动态链接库。这种方法的好处是可以选择性的替代哪个进程的API。而且适用于所有的Windows*作系统。 
    这里我选用的是第二种方法。 
    第二种方法需要先了解一点PE文件格式的知识。 
    首先是一个实模式的的DOS文件头,是为了保持和DOS的兼容。 
    接着是一个DOS的代理模块。你在纯DOS先运行Win32的可执行文件,看看是不是也执行了,只是显示的的是一行信息大意是说该Windows程序不能在DOS实模式下运行。 
    然后才是真正意义上的Windows可执行文件的文件头。它的具体位置不是每次都固定的。是由文件偏移$3C决定的。我们要用到的就是它。 
    如果我们在程序中调用了一个MessageBoxA函数那么它的实现过程是这样的。他先调用在本进程中的MessageBoxA函数然后才跳到动态链接库的MessageBoxA的入口点。即: 
    call messageBoxA(0040106c) 
    jmp dword ptr [_jmp_MessageBoxA@16(00425294)] 
    其中00425294的内容存储的就是就是MessageBoxA函数的入口地址。如果我们做一下手脚,那么...... 
    那就开始吧! 
    我们需要定义两个结构 
    type 
    PImage_Import_Entry = ^Image_Import_Entry; 
    Image_Import_Entry = record 
    Characteristics: DWORD; 
    TimeDateStamp: DWORD; 
    MajorVersion: Word; 
    MinorVersion: Word; 
    Name: DWORD; 
    LookupTable: DWORD; 
    end; 
    type 
    TImportCode = packed record 
    JumpInstruction: Word; file: //定义跳转指令jmp 
    AddressOfPointerToFunction: ^Pointer; file: //定义要跳转到的函数 
    end; 
    PImportCode = ^TImportCode; 
    然后是确定函数的地址。 
    function LocateFunctionAddress(Code: Pointer): Pointer; 
    var 
    func: PImportCode; 
    begin 
    Result := Code; 
    if Code = nil then exit; 
    try 
    func := code; 
    if (func.JumpInstruction = $25FF) then 
    begin 
    Result := func.AddressOfPointerToFunction^; 
    end; 
    except 
    Result := nil; 
    end; 
    end; 
    参数Code是函数在进程中的指针,即那条Jmp XXX的指令。$25FF就是跳转指令的机器码。 
    再下一篇我会讲如何替换下那个XXX的内容,让他跳到你想去的地方。
      

  6.   

    全VB写这样的程序很困难,
    最好用VC写
      

  7.   

    用VB也不难,关键是你要明白三个技术:
    1、PE引入表(import table)的结构
    2、远程线程注入
    3、写别的进程的内存数据的方法