我用FindWindow得到了某个窗口的句柄,再用什么函数可以遍历它上面的控件呢?

解决方案 »

  1.   

    用 EnumChildWindows 可得到有句柄的, 如果, 象label類, 就不知道如何得到了!
      

  2.   

    TO:aiirii(ari) 
    能说详细点吗?最好能给个例子,谢谢
      

  3.   

    不能吧.
    窗体上有些控件是没有句柄的,除非得到窗体实例,然后遍历COMPONENTS数组........
      

  4.   

    aiirii(ari)
    说的是个办法。
    如果这个程序是Delphi写的,那么你只能得到 那些从TWinControl继承下来的控件(他都是windows标准的窗口类),其他的这办法不行,其他办法我也不知道,呵呵。
      

  5.   

    TO:pazee(耙子)
    当然是delphi写了,你知道吗?能给个例子吗?
      

  6.   

    for i=0 toComponentCount -1 do可以获得所有的控件吧
      

  7.   

    TO:angle097113(深思不解) 
    你的方法只适合于得到窗体实例的情况,可我只得到窗体句柄而已
      

  8.   

    TO:XZHHAI(星之瀚海)谢谢
    我等你的好消息:)
      

  9.   

    type
      TForm1 = class(TForm)
        btn1: TButton;
        lst1: TListBox;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      FIndexOfHandle:Integer;
      FArrHandle:Array of THandle;
      FStrings:TStrings;
    function MyEnumChild(AHwnd: THandle; AParam: Cardinal):Boolean;stdcall;
    implementation{$R *.dfm}
    function MyEnumChild(AHwnd: THandle; AParam: Cardinal):Boolean;
    var
      lPChar:PChar;
      str:string;
    begin
      SetLength(FArrHandle,FIndexofHandle+1);
      FArrHandle[FIndexOfHandle] := AHwnd;
      GetMem(lPChar,256);
      GetClassName(AHwnd,lpchar,256);
      FStrings.Add(lpChar);
      FreeMem(lPChar);
      Inc(FIndexOfHandle);
      Result := True;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      lhwd:THandle;
    begin
      lhwd := FindWindow('TForm1','Form1');
      if lhwd =0 then Exit;
      FStrings := TStringList.Create;
      if EnumChildWindows(lhwd,@MyEnumChild,110) then
      begin
        ShowMessage('Successed');
        lst1.Items.Assign(FStrings);
      end;
      FStrings.Free;
    end;
    得到你需要的窗体上所有子窗口的类名及句柄,当然,没有句柄的界面元素是没有办法找出来的。
      

  10.   

    To:XZHHAI(星之瀚海)非常感谢你的回答^_^不过据我初步观察,标签控件没有找到,什么回事呢?
      

  11.   

    To:XZHHAI(星之瀚海)那有什么其它办法可以得到它的caption吗?
      

  12.   

    如果当前窗体form1中有各类控件:Tlable,Tedit,T...procedure Tform1.button1click(Sender:Tobject);
    var
      i:integer;
    begin
      for i:=0 to componentcounts-1 do 
      if Tcomponent[i] is Tlable then
        Tlable(Tcomponent[i]).caption:=inttostr(i);
    end;这段代码是得到每个lable控件的序号,并把它赋值给各自的caption属性.你想要得到caption的话,可以从这段代码中得到启发.(这代码我没运行过,可能有拼错的,出错的话发我短消息吧)
      

  13.   

    TO:ttllhh() 也许你没有看清楚我的问题。
    你的例子应该是得到了窗体的实例的情况下吧?可我只能得到窗体的句柄。因为我要读取的是另一个应用程序的某个窗体
      

  14.   


    for i:=0 to TForm(FindControl(AHandle)).componentcounts-1 do 
      

  15.   

    To:VisualLion(狮子)
    你的方法不行,编译不过
      

  16.   

    To:VisualLion(狮子)我又试了一下你的方法,当那个句柄为当前窗体的句柄就可以,即:
    for i:=0 to TForm(FindControl(Handle)).componentcounts-1 do 如将"Handle"替换成用FindWindow函数得到的其它应用程序的窗体句柄时就不行,即:
    Hwnd:=FindWindow(nil,'句柄练习');
    for i:=0 to TForm(FindControl(Hwnd)).componentcounts-1 do
      

  17.   

    你在vcl版搜一下,回答了N遍了,懒得回答了
      

  18.   

    刚才写的,机子上没有Delphi,也就没有测试
    var hMain:HWND;hChild:HWND;buffer:array[1..200] of char;
    begin
     hMain:=FindWindow(nil,'XXXXX');
     hChild:=FindWindowEx(hMain,0,nil,nil);
     while hChild do
     begin
      GetWIndowText(hChild,@buffer,200);
      ListBox1.Items.Add(StrPas(@Buffer));
      hChild:=FidWidowEx(hMain,hChild,nil,nil);//look for next control
     end;
    end;
      

  19.   

    To: Eastunfail(浴血雏龙)==(恶鱼杀手)谢谢你的回答。
    我做了试验,窗体上有文本框、标签和按钮,你的方法只取到了按钮上Caption
      

  20.   

    To:chw_csdn_chw(chw) 方便的话可以把找一下吗?呵呵
      

  21.   

    标签就不要指望了。除非是使用的静态文本控建,否则是不可能得到标签的文本的,因为标签空间无论是在VB中还是在Delphi中,都是由父控件画出来的,而不是由Windows操作系统管理的。你若是不相信你可以看看TButton和TLabel的继承树,你就会发现问题所在了。而文本框找不到??如果是密码空间,在NT内核下是不可能直接跨进程读取文本的,那就要涉及到挂钩和远线程技术了
      

  22.   

    可以栏截WINAPI 如TextOut,然后取得它的参数,鼠标取词就是用这种技术,不过实现难度很大。
      

  23.   

    TO:Eastunfail(浴血雏龙)==(恶鱼杀手) 除标签控件外的控件取值问题,在其它朋友的帮助下我已经解决了。现在就差标签控件了
      

  24.   

    TO:wasprui(wasp) 你有那方面的资料吗?我现在必须取得标签控件的值,要不我就惨了请其他知道的朋友帮帮忙,好吗?
      

  25.   

    for i=0 toComponentCount -1 do
    先占个位子 明天给你贴代码 嘿嘿
      

  26.   

    To:Eastunfail(浴血雏龙)==(恶鱼杀手)我找资料的时候,见到别人提到什么通过截获Textout可以得到标签内容,但没有详细说明,所以我觉得应该有办法的
      

  27.   

    TO:delphiseabird(沙鸥) 你目前写的这句代码,好像也是得到了窗体实例的情况下不过,还是很感谢你,也希望你的完整代码能解决我的问题:)
      

  28.   

    你可以使窗体界面无效,然后截取textout函数,当然这需要钩子函数!网上有很多讲这方面的文章!!
      

  29.   

    TO:fygzg(伏鹰)你有这方面的资料吗?能发给我吗?我的E-Mail: [email protected]
      

  30.   

    呵呵 
    我得代码只是当前进程的,没看好你的题目
    for i := 0 to ComponentCount - 1 do
        begin
          if not (Components[i] is TControl) then Continue;
           
        end;你要修改其他进程的控件可能不行的,会引发windows系统的一般保护性异常。
    这个例子倒是可以参考一下:
    http://www.csdn.net/develop/Read_Article.asp?Id=22661
      

  31.   

    TO:delphiseabird(沙鸥) 我不是要改其他进程的控件,我只是想把某个应用程序中的某个窗体中的控件值读出来而已,不是修改了,你有办法吗?只是读取,并非修改^_^对了,今晚是平安夜,祝你快乐!天天快乐!!同时也祝你其他的兄弟姐妹们快乐!!!^_^
      

  32.   

    TO:delphiseabird(沙鸥) 你推荐的文档我看过了,似乎只适合于有句柄的控件,而标签没有句柄的,所以不适合你有其它的方法吗?最好有个例子:)我的E-Mail:[email protected]
      

  33.   

    无窗口句柄的标签是由父窗口画出来的,如要取得其文本,你可以能过HOOK TextOut之类的API来实现,至于HOOK API的资料,文档区中有,你去找来改改吧
      

  34.   

    TO:pankun(剑神一笑)(闭关不忘灌水) 谢谢,我去看看
      

  35.   

    TO:pankun(剑神一笑)(闭关不忘灌水) 找不到合适的啊。你有相关资料吗?