程序运行时,出现一个抓图矩形,然后将其覆盖范围内的文本内容读取出来。最好有源码事例。解决了,立即以2000分相赠(因为不能一次送出,我会分20次送完),决不食言。

解决方案 »

  1.   

    如果只是取窗口文本倒容易.找找API HOOK的例子吧.
      

  2.   

    这不就是类似金山词霸取词的东西吗。
    原理不难,1.利用hook,接管TextOut和TextOutXY这类的函数;因为屏幕的文字就是通过他们写上去的;
    2.强制刷新制定的矩形范围;这个时候就能得到屏幕的内容了。类似的代码网上有很多,你可以自己搜索。
      

  3.   

    为了2000分,国庆我试试看!! 不过,你的所谓
    >>出现一个抓图矩形,然后将其覆盖范围内的文本内容读取出来
    不会是要矩形中的所有窗口的标题,菜单都要吧?? 而且,类似 pdf 这种,可能有点难度!
      

  4.   

    呵呵。 Eastunfail(浴血雏龙)==(恶鱼杀手) 把你的代码帖出来啊。
      

  5.   

    以下全是抄以前贴子的unit GetWord;interfaceuses
      SysUtils,
      windows,
      messages;const NHD_GETWORD_TIMER = 2;
    const NHD_MAX_TEXTLEN = 1024;
    const NHD_WIN_INITPOSX = -1;
    const NHD_WIN_INITPOSY = -1;
    const NHD_FLYWIN_WIDTH = 1;
    const NHD_FLYWIN_HEIGHT = 1;
    const NHD_CLASSNAME_LEN = 256;
    const NHD_GW_WAITING_TIME = 200;   //get word waiting time;  (*设置屏幕抓取函数*)
     type TBL_SetFlag32 = function (nFlag : word;    //设置是否取词
                                 hNotifyWnd : HWND;    //当取词后得窗口句柄
                                 MouseX : integer;    //X坐标
                                 MouseY : integer): DWORD;stdcall;    //Y坐标
    (*   功能:
    启动或停止取词。
       参数:
           nFlag
                  [输入] 指定下列值之一:
                  GETWORD_ENABLE: 开始取词。在重画被取单词区域前设置此标志。nhw32.dll是通过
                                  重画单词区域,截取TextOutA, TextOutW, ExtTextOutA,
                                  ExtTextOutW等Windows API函数的参数来取词的。
                  GETWORD_DISABLE: 停止取词。
           hNotifyWnd
                  [输入] 通知窗口句柄。当取到此时,向该通知窗口发送一登记消息:GWMSG_GETWORDOK。
           MouseX
    [输入] 指定取词点的X坐标。
           MouseY
                  [输入] 指定取词点的Y坐标。
        返回值:
           可忽略。
    *)
    type TLPRECT = ^TRECT;  (*定义指针先*)
     type TBL_GetText32 = function(lpszCurWord : pchar;
                                 nBufferSize : integer;
                                 lpWordRect : TLPRECT ): DWORD;stdcall;
        (*功能:
          从内部缓冲区取出单词文本串。对英语文本,该函数最长取出一行内以空格为界的三个英文单词串,
          遇空格,非英文字母及除'-'外的标点符号,则终止取词。对汉字文本,该函数最长取出一行汉字串,
          遇英语字母,标点符号等非汉语字符,则终止取词。该函数不能同时取出英语和汉语字符。
        参数:
           lpszCurWord
                  [输入] 目的缓冲区指针。
           nBufferSize
                  [输入] 目的缓冲区大小。
           lpWordRect
                  [输出] 指向 RECT 结构的指针。该结构定义了被取单词所在矩形区域。
        返回值:
            当前光标在全部词中的位置。*) type   TSetNHW32 = function(): boolean; stdcall;
     (*
         功能:
            Win NT/2000 环境下的初始化函数。一般在程序开始时,调用一次。
        参数:
            无。
        返回值:
            如果成功 TRUE ,失败 FALSE 。
     *) type  TResetNHW32= function():boolean; stdcall;
    (*    功能:
            Win NT/2000 环境下的去初始化函数。一般在程序结束时调用。
        参数:
            无。
        返回值:
            如果成功 TRUE ,失败 FALSE 。*)function NHD_FlyWndProc(hWnd, Msg,wParam,lParam: Integer): Integer; stdcall;
    function NHD_CreateWindow(hInst: Integer): HWND;
    procedure NHD_BeginGetWord(ptMousePos: TPOINT);function NHD_ExitGetWords(): boolean;
    function NHD_DestroyWindow(): boolean;
    procedure NHD_FreeLoadedLib();
    function NHD_InitGetWords(hInst: THANDLE; hwnd: HWND): HWND;
    function NHD_LoadGetWordLib(): boolean;var
      WinClass: TWndClassA;
      Inst: Integer;
      Msg: TMsg;  g_TextBuffer : array[0..1024] of char;  g_hFlyWin : HWND;
      g_nGWTimerID : word;
      
      g_hGetWordInst : Integer;
      BL_SetFlag32 : TBL_SetFlag32;
      BL_GetText32 : TBL_GetText32;
      SetNHW32 : TSetNHW32;
      ResetNHW32 : TResetNHW32;
      g_hNHMainWin : HWND;
      
      g_WM_GetWordOk:WORD;
      g_bInGetWord : boolean;
      currpoint:Tpoint;
      G_Rect : TRECT;
    implementationuses unit1;function NHD_CreateWindow(hInst: Integer): HWND;
    var
       hwnd : LongWord;
       wc : TWndClassA;
    begin
      if hInst = 0 then begin
        result :=0;
        exit;
      end;  with wc do
      begin
        style              := WS_EX_TOPMOST;
        lpfnWndProc        := @NHD_FlyWndProc;  (*消息处理函数*)
        hInstance          := hInst;
        hbrBackground      := color_btnface + 1;
        lpszClassname      := 'NHD_FLYWIN_DEMO';
        hicon              := 0;
        hCursor            := 0;
        cbClsExtra         := 0;
        cbWndExtra         := 0;
      end;
      RegisterClass(wc);  hwnd := CreateWindowEx (WS_EX_TOPMOST or WS_EX_TOOLWINDOW,
                               'NHD_FLYWIN_DEMO',
                               'NHD_FlyWindow_Demo',
                               WS_POPUP or WS_VISIBLE,
                               NHD_WIN_INITPOSX,
                               NHD_WIN_INITPOSY,
                               NHD_FLYWIN_WIDTH,
                               NHD_FLYWIN_HEIGHT,
                               0,  
                               0,
                               hInst,
                               nil);
        
      result := hwnd;
    end;function NHD_FlyWndProc(hWnd, Msg,wParam,lParam: Integer): Integer; stdcall;
    begin
      //Unhook textout when reveived msg from getword;
      if msg = g_WM_GetWordOk then begin
        if g_bInGetWord then begin
          g_bInGetWord := FALSE;
          KillTimer(g_hFlyWin, NHD_GETWORD_TIMER);
          g_nGWTimerID := 0;
          BL_SetFlag32(GETWORD_DISABLE, 0, 0, 0);      if wParam = 0 then begin
            BL_GetText32(@g_TextBuffer, sizeof(g_TextBuffer), @G_Rect);
          end;      PostMessage(g_hNHMainWin, NHD_WM_GETWORD_OK, 0, 0);
          result := 0;
          exit;
        end;
      end;  result := DefWindowProc(hWnd, msg, wParam, lParam);
    end;
      

  6.   

    还有这http://www.delphibbs.com/delphibbs/dispq.asp?lid=1123349太太多多了!!