一个应用程序的窗体名为Form2,窗体中有两个Edit,分别为Edit1和Edit2,
我想得到Edit1和Edit2的内容,下面的程序为什么得到的是Edit2的内容?不知道错在哪了,
如果想分别得到Edit1和Edit2的值应该怎么写呢?希望能给出实际的例子,谢谢!procedure TForm1.Timer1Timer(Sender: TObject);
var
HWindow,hedit,hbutton: THandle; 
szText: Array[0..255] Of char;
Begin
       HWindow := 0;
       HWindow := FindWindow('TForm2', nil);
       If HWindow <> 0 Then
       Begin
         hedit:= FindWindowEx(hwindow, 0,'TEdit', nil); 
       end;
       if hedit<>0 then
        begin
         SendMessage(hEdit, WM_GetTEXT, 256,integer(@szText[0]));
        end;      
end;

解决方案 »

  1.   

    写一个回调函数, 用EnumChildWindows调用它, 在回调函数里检查类名, 得到Text
    function EnumWindowsProc(H: hWnd): boolean; stdcall;
    var
      AClass, AText: array[0..255] of char;
    begin
      Result := True;
      FillChar(AClass, 256, 0);
      FillChar(AText, 256, 0);
      GetClassName(H, AClass, 255);
      if StrPas(AClass) = 'TEdit' then
        begin
        GetWindowText(H, AText, 255);
        Showmessage(StrPas(AText));
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      EnumChildWindows(Form2.Handle, @EnumWindowsProc, 0);
    end;
      

  2.   


    {再增加一点新功能:}function EnumWindowsProc(H: hWnd): boolean; stdcall;
    var
      AClass, AText: array[0..255] of char;
      R: TRect;
    begin
      Result := True;
      FillChar(AClass, 256, 0);
      FillChar(AText, 256, 0);
      GetClassName(H, AClass, 255);
      if StrPas(AClass) = 'TEdit' then begin
        GetWindowText(H, AText, 255);
        GetWindowRect(H, R);
        Showmessage(Format('Edit句柄:%x;内容:%s;顶点座标:%d,%d',[H, StrPas(AText), R.Left, R.Top]));
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      EnumChildWindows(窗体句柄, @EnumWindowsProc, 0);
    end;
      

  3.   

    function EnumWindowsProc(H: hWnd): boolean; stdcall;
    var
      AClass, AText: array[0..255] of char;
    begin
      Result := True;
      FillChar(AClass, 256, 0);
      FillChar(AText, 256, 0);
      GetClassName(H, AClass, 255);
      if StrPas(AClass) = 'TEdit' then
        begin
        GetWindowText(H, AText, 255);
        Showmessage(StrPas(AText));
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
    HWindow:THandle;
    begin
      HWindow:=0;
      HWindow:=findwindow('TForm2',nil);
      if HWindow<>0 then
      begin
        EnumChildWindows(HWindow, @EnumWindowsProc, 0);
      end;
    end;Edit1和Edit2都有内容,为什么输出的都是空的呢?
      

  4.   

    检查你的窗体类名是不是TForm2 , 以及你的Edit类名是不是TEdit
      

  5.   

    再就是, 最好用标题判断窗体:HWindow:=findwindow(nil,'Form2');
      

  6.   

    窗体类名是TForm2 , Edit类名是TEdit 
    如果这样写HWindow:=findwindow(nil,'Form2');
    HWindow的结果就是0,form2是运行的,不知道是什么原因?
      

  7.   

    上面问题解决,我刚才是在调试状态运行form2,后来用form2的执行程序就可以了,如果我只想得到Edit2的内容应该怎么做呢?
      

  8.   


    {喝多了, 我有点晕. 刚才在解决GetWindowText无法返回Text的问题,是这样解决的:}
    function EnumWindowsProc(H: hWnd; I: LParam): bool; stdcall;
    var
      AClass, AText: array[0..255] of char;
      R: TRect;
    begin  FillChar(AClass, 256, 0);
      FillChar(AText, 256, 0);
      GetClassName(H, AClass, 255);
      if StrPas(AClass) = 'TEdit' then begin
        //GetWindowText(H, AText, 255);
        SendMessage(H, WM_GetText, 255, integer(@AText));
        GetWindowRect(H, R);
        Showmessage(Format('Edit句柄:%x;内容:%s;顶点座标:%d,%d',[H, StrPas(AText), R.Left, R.Top]));
      end;
      Result := True;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      H:hWnd;
    begin
      H:= Findwindow(nil, 'Form2');
      EnumChildWindows(H, @EnumWindowsProc, 0);
    end;
    楼主再查一下你测试用的工程里有没有名为Form2, 类名为TForm2的窗体, 也就是说与被测试的窗体同名,同类的