这个代码,如果handle是本程序的RichEdit,那么一切正常。但是如果RichEdit在另外的程序上,那么WM_GETTEXTLENGTH能得到正确的结果。而EM_GETTEXTRANGE得不到。查了MSDN,好像Sendmessage在进程间传USER 定义的消息时不能直接传。要经过特别的步奏。没有这方面的经验。请指教。
function TForm1.GetText(_handle:hwnd):string;
var iLength:integer;
    tRange:TEXTRANGE;
    sText:String;
    n_Ret:Integer;
begin  iLength:=SendMessage(_handle,WM_GETTEXTLENGTH,0,0);
  Result:='';
  if iLength=0 then Exit;
  sText:='';
  setLength(sText,iLength+1);  tRange.chrg.cpMin:=0;
  tRange.chrg.cpMax:= iLength+1;
  tRange.lpstrText :=pChar(sText);
  n_Ret:=sendMessage(_handle,EM_GETTEXTRANGE,0,Longint(@tRange));
  Form1.Edit2.Text:=IntToStr(iLength);
  Form1.Edit1.Text:=IntToStr(n_Ret);
  Result:=sText;
end;//得到另外应用的RichEdit的内容
procedure TForm1.Button1Click(Sender: TObject);
var
 _hWnd_Win,_hWnd_Edt: HWND;
  nLen: Integer;
  Buff: String;begin
    _hWnd_Win := FindWindow('TForm1','111');
    _hWnd_Edt := FindWindowEx(_hWnd_Win,0, 'TRichEdit',nil);
      if _hWnd_Edt<>0 then
      Begin
            Buff := GetText(_hWnd_Edt);
      end;
      memo1.Lines.Add(Buff);
  end;

解决方案 »

  1.   

    搞了半个小时
    你看看这种方法行不行
    在我的机子上调试通过procedure TForm1.Button1Click(Sender: TObject);
    var
        dd,hh: hwnd;
        i: integer;
        mem: pchar;
    begin
        dd := FindWindow(nil,'SendMsg');
        if dd>0 then
        begin
            hh := FindwindowEx(dd,0,pchar('TRichEdit'),nil);
            if hh>0 then
            begin
                i := SendMessage(hh,WM_GETTEXTLENGTH,0,0);
                getmem(mem,i+1);
                SendMessage(hh,WM_GETTEXT,i+1,LongInt(mem));
                showmessage(strpas(mem));
            end
            else
                showmessage('no such window');
        end;
        getmem(mem,0);
    end;