诚心请大虾给个注释,在网上看到的部分程序,看不懂。
function    EnumChildWindowsProc(hwnd,    lparam:    Integer):    Boolean;   
   var   
       buffer:    array[0..255]    of    char;   
   begin   
       Result    :=    True;   //这行是什么意思?
       GetClassName(hwnd,buffer,256);//根据句柄获取类名   
       if    StrPas(Buffer)='Edit'    then    //如果类名是Edit  
       begin   
           SendMessage(hwnd,WM_GETTEXT,256,lparam); //这行是什么意思?
           Result:=False;   //这行是什么意思?
       end;   
   end;   
    
   procedure    TForm1.Button1Click(Sender:    TObject);   
   var   
       hwnd:    Integer;   
       buffer:    array[0..255]    of    char;   
   Begin   
       hwnd    :=    FindWindow('CabinetWClass',nil);   
       if    hwnd<>    0    then   
       begin   
           EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));   
           Caption    :=    StrPas(buffer);   
       end;   
   end;

解决方案 »

  1.   

    function    EnumChildWindowsProc(hwnd,    lparam:    Integer):    Boolean;   
       var   
           buffer:    array[0..255]    of    char;   
       begin   
           Result    :=    True;   //返回True的意思就是继续往下遍历
           GetClassName(hwnd,buffer,256);//根据句柄获取类名   
           if    StrPas(Buffer)='Edit'    then    //如果类名是Edit  
           begin   
               SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
               Result:=False;   //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
           end;   
       end;   
        
       procedure    TForm1.Button1Click(Sender:    TObject);   
       var   
           hwnd:    Integer;   
           buffer:    array[0..255]    of    char;   
       Begin   
           hwnd    :=    FindWindow('CabinetWClass',nil);   
           if    hwnd<>    0    then   
           begin   
               EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));   
               Caption    :=    StrPas(buffer);   
           end;   
       end;
      

  2.   

    EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));   
    这句中,@EnumChildWindowsProc是什么意思?
    SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
    这部分,获取后,怎么才能把这部分的内容发送到memo中?
    诚心请教。
      

  3.   

    EnumChildWindows:函数功能:枚举一个父窗口的所有子窗口。
    函数原型:
    BOOL EnumChildWindows(HWND hWndParent,WNDENUMPROC lpEnumFunc, LPARAM lParam);
    各个参数如下:
    HWND hWndParent 父窗口句柄
    WNDENUMPROC lpEnumFunc 回调函数的地址
    LPARAM lParam 自定义的参数
    注意:回调函数的返回值将会影响到这个API函数的行为。如果回调函数返回true,则枚举继续直到枚举完成;如果返回false,则将会中止枚举。EnumChildWindowsProc为回调函数,通过这个函数循环枚举HWND下的所有子窗口,当EnumChildWindowsProc返回为False的时候则停止枚举。
      

  4.   

    function    EnumChildWindowsProc(hwnd,    lparam:    Integer):    Boolean;   
       var   
           buffer:    array[0..255]    of    char;   
       begin   
           Result    :=    True;   //返回True的意思就是继续往下遍历
           GetClassName(hwnd,buffer,256);//根据句柄获取类名   
           if    StrPas(Buffer)='Edit'    then    //如果类名是Edit  
           begin   
               SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
               Result:=False;   //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
           end;   
       end;   
        
       procedure    TForm1.Button1Click(Sender:    TObject);   
       var   
           hwnd:    Integer;   
           buffer:    array[0..255]    of    char;   
       Begin   
           hwnd    :=    FindWindow('CabinetWClass',nil);   
           if    hwnd<>    0    then   
           begin   
               EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));   
               //Caption    :=    StrPas(buffer);   
               Memo1.Lines.Add(StrPas(buffer));//显示到Memo中
           end;   
       end;
      

  5.   

    也可以这样显示到Memo中:function    EnumChildWindowsProc(hwnd,    lparam:    Integer):    Boolean;   
       var   
           buffer:    array[0..255]    of    char;   
       begin   
           Result    :=    True;   //返回True的意思就是继续往下遍历
           GetClassName(hwnd,buffer,256);//根据句柄获取类名   
           if    StrPas(Buffer)='Edit'    then    //如果类名是Edit  
           begin   
               SendMessage(hwnd,WM_GETTEXT,256,lparam); //获取Edit里面的内容
               Result:=False;   //说明找到我需要的Edit的内容了,不需要再往下遍历, 所以返回False,终止遍历
               Form1.Memo1.Lines.Add(StrPas(buffer));//显示到Form1的Memo中
               如果你把Result:=False;这句Mark掉,则程式会将hwnd下所有的Edit的内容显示到Memo中,你可以试下
           end;   
       end;   
        
       procedure    TForm1.Button1Click(Sender:    TObject);   
       var   
           hwnd:    Integer;   
           buffer:    array[0..255]    of    char;   
       Begin   
           hwnd    :=    FindWindow('CabinetWClass',nil);   
           if    hwnd<>    0    then   
           begin   
               EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));   
               //Caption    :=    StrPas(buffer);
           end;   
       end;
      

  6.   


    begin
    Result:=True;
    GetClassName(AhWnd,wndClassName,254);
    if StrPas(WndClassName)='Edit' then
    begin
     SendMessage(hwnd,WM_GETTEXT,256,lparam);{编译中总是提示:1.[Error] Unit1.pas(40): '(' expected but ',' found,2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found} Form1.Memo1.Lines.Add(StrPas(GetClassName));
    end;
    end;
      

  7.   

    Form1.Memo1.Lines.Add(StrPas(buffer));//显示到Form1的Memo中
    改为
    Form1.Memo1.Lines.Add(PChar(lparam));
      

  8.   


    SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
    编译中总是提示:
    1.[Error] Unit1.pas(40): '(' expected but ',' found,
    2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found
      

  9.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean;
    var
       buffer: array[0..255] of Char;
    begin   
      Result := True;
      GetClassName(hwnd,buffer,256);
      if StrPas(Buffer)='Edit' then
      begin
        SendMessage(hwnd,WM_GETTEXT,256,lparam);
        Form1.Memo1.Lines.Add(PChar(lparam));
        Result:=False;
      end;
    end;
        
    procedure TForm1.Button1Click(Sender: TObject);
    var   
      hwnd: Integer;
      buffer: array[0..255] of char;
    Begin   
       hwnd := FindWindow('CabinetWClass',nil);
       if hwnd <> 0 then
       begin   
         EnumChildWindows(hwnd,@EnumChildWindowsProc,Longint(@buffer[0]));
         Caption := StrPas(buffer);
       end;   
    end;end.
      

  10.   


    SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
    编译中总是提示:
    1.[Error] Unit1.pas(40): '(' expected but ',' found,
    2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found

    参考这一份,我测试了没问题。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function GetWndText(ThWnd: hWnd): string;
    var
      Ret:LongInt;
      mText:PChar;
      Buf:Integer;
    begin
      Ret := SendMessage(ThWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
      GetMem(mText,Ret);
      try
        Buf := LongInt(mText);
        SendMessage(ThWnd, WM_GETTEXT, Ret, Buf);
        Result := StrPas(mText);
      finally
        FreeMem(mText,Ret);
      end;
    end;function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; stdcall;
    var
       buffer: array[0..255] of Char;
    begin   
      Result := True;
      GetClassName(hwnd,@buffer,256);
      if Buffer='Edit' then
      begin
        Form1.Memo1.Lines.Add(IntTOHex(hwnd, 8) +': '+ GetWndText(hwnd));
        //SendMessage(hwnd,WM_GETTEXT,256,lparam);
        Result:=False;
      end;
    end;
        
    procedure TForm1.Button1Click(Sender: TObject);
    var   
      hwnd: Integer;
      buffer: array[0..255] of char;
    Begin
       hwnd := FindWindow('CabinetWClass',nil);
       if hwnd <> 0 then
       begin
         Form1.Memo1.Lines.Add('Handle: ' + IntTOHex(hwnd, 8));
         EnumChildWindows(hwnd,@EnumChildWindowsProc,0);
         //Caption := StrPas(buffer);
       end;
    end;end.
      

  11.   

    感谢feiba7288的全方位的答复。辛苦你了。能否加我关注啊,这样我才能给你发私信。
    我没有说清楚,这个Edit是另外的程序中的,和Memo不在同一个程序中。
    这个程序就是寻找到另外程序的句柄后,再遍历子窗口,如果是edit就把文本读出来。getwindowtext只能读取到其他的控件的,Edit读不出来。
      

  12.   


    SendMessage(hwnd,WM_GETTEXT,256,lparam);这句编译出来总有问题,不好意思,我是超级菜鸟,太麻烦你了。
    编译中总是提示:
    1.[Error] Unit1.pas(40): '(' expected but ',' found,
    2.[Error] Unit1.pas(40): Statement expected, but expression of type 'Integer' found

    参考这一份,我测试了没问题。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function GetWndText(ThWnd: hWnd): string;
    var
      Ret:LongInt;
      mText:PChar;
      Buf:Integer;
    begin
      Ret := SendMessage(ThWnd, WM_GETTEXTLENGTH, 0, 0) + 1;
      GetMem(mText,Ret);
      try
        Buf := LongInt(mText);
        SendMessage(ThWnd, WM_GETTEXT, Ret, Buf);
        Result := StrPas(mText);
      finally
        FreeMem(mText,Ret);
      end;
    end;function EnumChildWindowsProc(hwnd, lparam: Integer): Boolean; stdcall;
    var
       buffer: array[0..255] of Char;
    begin   
      Result := True;
      GetClassName(hwnd,@buffer,256);
      if Buffer='Edit' then
      begin
        Form1.Memo1.Lines.Add(IntTOHex(hwnd, 8) +': '+ GetWndText(hwnd));
        //SendMessage(hwnd,WM_GETTEXT,256,lparam);
        Result:=False;
      end;
    end;
        
    procedure TForm1.Button1Click(Sender: TObject);
    var   
      hwnd: Integer;
      buffer: array[0..255] of char;
    Begin
       hwnd := FindWindow('CabinetWClass',nil);
       if hwnd <> 0 then
       begin
         Form1.Memo1.Lines.Add('Handle: ' + IntTOHex(hwnd, 8));
         EnumChildWindows(hwnd,@EnumChildWindowsProc,0);
         //Caption := StrPas(buffer);
       end;
    end;end.
    感谢feiba7288的全方位的答复。辛苦你了。能否加我关注啊,这样我才能给你发私信。
    我没有说清楚,这个Edit是另外的程序中的,和Memo不在同一个程序中。
    这个程序就是寻找到另外程序的句柄后,再遍历子窗口,如果是edit就把文本读出来。getwindowtext只能读取到其他的控件的,Edit读不出来。
    先结贴,辛苦大虾!!!