我想获取另一个程序中的dxtreelist窗体的句柄,那个程序也是用delphi开发的。但是用h:=FindWindowEx(handle,0,'Tdxtreelist',nil);这句却得不到dxtreelist的句柄,不知道是什么原因,还请高手指教。是不是只有delphi自带的控件才能获取句柄呢?第三方的控件都无法获取句柄吗?

解决方案 »

  1.   

    h:=FindWindowEx(handle,0,'Tdxtreelist',nil);//handle那里来的是使用findwindow获得的dxtreelist所在窗口句柄么?
      

  2.   

    对,handle是父窗体的句柄,这个没问题的。
      

  3.   

    我以那个父窗体为基准,遍历了所有的子窗体,delphi自带的控件都能够显示出来,就是dxtreelist不显示。所以有点困惑,不知道是不是第三方的控件都无法获取句柄?
      

  4.   

    h:=FindWindowEx(handle,0,'Tdxtreelist',nil);这句本身就是用类名来查找的呀。不知道还有没有别的方法
      

  5.   

    帮忙顶,,
    不知道Delphi 能不能根据 窗体句柄创建或得到TForm对象,,如果那样就可以使用 form1.controlcount 进行遍历了。。
    等待高人!!
      

  6.   

    如果要得到对象实例,只有使用hook了,这方面我的知识还不够。况且获取一个窗体的句柄,没必要这么麻烦吧?汗还请高手解答一下,能否获取第三方控件的句柄
      

  7.   

    MARK能不能根据对象实例来获得句柄呢
      

  8.   

    一般情况下,都是hook注入后才能获取对象实例的,但是hook必须首先得到句柄啊,否则怎么hook呢?矛盾啊
      

  9.   

    如果第三方是 自绘控件,估计是得不到句柄的,只有TWinControl的子类才有句柄。。
      

  10.   

    有一个极度麻烦的方法,不过要求控件是开源的……估计还不如HOOK方便……
    http://blog.csdn.net/zswang/archive/2008/07/13/2645555.aspx
      

  11.   

    谢谢gyk120,真的是极度麻烦。dxtreelist应该不是自画的控件吧,类似于delphi的stringgrid控件
      

  12.   

    问题可能是:
    类名大小写没写对?
    要找的控件不是直接放在窗口中,而是放在容器控件中?我上传了一个工具 你可以用它先看看窗口结构
    http://download.csdn.net/source/1299537
      

  13.   

    你说的这两个问题,我都考虑过了,也验证过,没问题的。那个外部程序我已经用DEDE反编译过,窗体层次不会错。类名是从spy++里复制出来的,应该没问题。另外你的程序需要资源分才能下载,我没有啊
      

  14.   

    可以使用cpy++看看得到的句柄是否正确。。
    一步一步的调试一下,找到真正原因。
    (是在没办法了,理论来讲如果句柄正确,FindWindowEx 应该可以搞定的。。)
      

  15.   

    不知道为什么,spy++就能查看所有窗体的句柄,可是程序中自己写代码就找不出来。
      

  16.   

    我上传的那程序已经设置为0资源分了啊 还不能下载?
    一般SPY++能找到的就应该没有问题,问题都是自己的
    不过SPY++是抓某个窗口的,我的程序可以抓整个窗口的可视控件结构,层次能看清楚
      

  17.   

    谢谢ysai朋友的无私帮助。这个程序很好用的,查看下来,目标程序的窗体结构跟我代码中编写的是一样的,没有差错。但是在代码中就是无法获取dxtreelist控件的句柄。我在想,是不是必须在自己的delphi中安装dxtreelist这个控件,然后在程序里才能查看到句柄,否则就无法获取。不知道会不会是这样的问题。因为这个dxtreelist控件是一个外部程序上的,我自己的delphi中没有安装。而且现在这个控件也不太好找了
      

  18.   

    如果我的程序能抓到,那就应该是你的代码问题了.
    因为我的程序也是用的FindWindowEx这个函数,只不过没有指定类名罢了
      

  19.   

    能否给段代码参考一下?我这边一直搞不出来。目标程序就是在form上放置一个dxtreelist控件。麻烦你了
      

  20.   

    我现在是想试着从dxtreelist中读取单元格的数据,用hook注入,但是在这之前必须先获取这个控件的句柄,然后才能有下一步的操作
      

  21.   

    我的枚举子窗口代码就这么简单
    procedure TFrmWindowView.EnumChildWindows(const AHandle: HWND);
    var
      hc          : HWND;
      tn          : TTreeNode;
      ctn         : TTreeNode;
      hi          : PHandleInfo;
      h           : HWnd;
    begin
      hc  :=  FindWindowEx(AHandle, 0, nil, nil);
      while hc > 0 do
      begin
        New(hi);
        hi.HandleType :=  Window;
        hi.Hwnd       :=  hc;
        hi.HandleInfo :=  GetWindowInfo(hc);
        tn  :=  tv.Items.AddChildObject(ndParent,
            PWindowInfo(hi.HandleInfo).Text + ' - '+
            PWindowInfo(hi.HandleInfo).ClassName
            , hi);    ctn       :=  ndParent;
        ndParent  :=  tn;
        h         :=  hParent;
        hParent   :=  hc;
        //枚举子窗口
        EnumChildWindows(hc);
        hParent   :=  h;
        ndParent  :=  ctn;
        hc  :=  FindWindowEx(AHandle, hc, nil, nil);
      end;
    end;
      

  22.   

    谢谢ysai朋友,明天早上我再试一下你的代码,看看是否管用。
      

  23.   

    刚才试了一下ysai朋友的代码,用h:=FindWindowEx(handle,0,nil,nil);的形式来编写,还是一样,得不到希望的结果。因为我自己的delphi中没有安装dxtreelist控件,所以不知道会不会是这个问题:获取一个外部程序中某一个控件的句柄,是不是自己的delphi中也必须要安装这个控件?希望能有高手帮我解决这个问题。原先帖子的分低,现在又加了100分,还请高手门能不吝赐教!