问一个句柄的问题 我想获取另一个程序中的dxtreelist窗体的句柄,那个程序也是用delphi开发的。但是用h:=FindWindowEx(handle,0,'Tdxtreelist',nil);这句却得不到dxtreelist的句柄,不知道是什么原因,还请高手指教。是不是只有delphi自带的控件才能获取句柄呢?第三方的控件都无法获取句柄吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 h:=FindWindowEx(handle,0,'Tdxtreelist',nil);//handle那里来的是使用findwindow获得的dxtreelist所在窗口句柄么? 对,handle是父窗体的句柄,这个没问题的。 我以那个父窗体为基准,遍历了所有的子窗体,delphi自带的控件都能够显示出来,就是dxtreelist不显示。所以有点困惑,不知道是不是第三方的控件都无法获取句柄? h:=FindWindowEx(handle,0,'Tdxtreelist',nil);这句本身就是用类名来查找的呀。不知道还有没有别的方法 帮忙顶,,不知道Delphi 能不能根据 窗体句柄创建或得到TForm对象,,如果那样就可以使用 form1.controlcount 进行遍历了。。等待高人!! 如果要得到对象实例,只有使用hook了,这方面我的知识还不够。况且获取一个窗体的句柄,没必要这么麻烦吧?汗还请高手解答一下,能否获取第三方控件的句柄 MARK能不能根据对象实例来获得句柄呢 一般情况下,都是hook注入后才能获取对象实例的,但是hook必须首先得到句柄啊,否则怎么hook呢?矛盾啊 如果第三方是 自绘控件,估计是得不到句柄的,只有TWinControl的子类才有句柄。。 有一个极度麻烦的方法,不过要求控件是开源的……估计还不如HOOK方便……http://blog.csdn.net/zswang/archive/2008/07/13/2645555.aspx 谢谢gyk120,真的是极度麻烦。dxtreelist应该不是自画的控件吧,类似于delphi的stringgrid控件 问题可能是:类名大小写没写对?要找的控件不是直接放在窗口中,而是放在容器控件中?我上传了一个工具 你可以用它先看看窗口结构http://download.csdn.net/source/1299537 你说的这两个问题,我都考虑过了,也验证过,没问题的。那个外部程序我已经用DEDE反编译过,窗体层次不会错。类名是从spy++里复制出来的,应该没问题。另外你的程序需要资源分才能下载,我没有啊 可以使用cpy++看看得到的句柄是否正确。。一步一步的调试一下,找到真正原因。(是在没办法了,理论来讲如果句柄正确,FindWindowEx 应该可以搞定的。。) 不知道为什么,spy++就能查看所有窗体的句柄,可是程序中自己写代码就找不出来。 我上传的那程序已经设置为0资源分了啊 还不能下载?一般SPY++能找到的就应该没有问题,问题都是自己的不过SPY++是抓某个窗口的,我的程序可以抓整个窗口的可视控件结构,层次能看清楚 谢谢ysai朋友的无私帮助。这个程序很好用的,查看下来,目标程序的窗体结构跟我代码中编写的是一样的,没有差错。但是在代码中就是无法获取dxtreelist控件的句柄。我在想,是不是必须在自己的delphi中安装dxtreelist这个控件,然后在程序里才能查看到句柄,否则就无法获取。不知道会不会是这样的问题。因为这个dxtreelist控件是一个外部程序上的,我自己的delphi中没有安装。而且现在这个控件也不太好找了 如果我的程序能抓到,那就应该是你的代码问题了.因为我的程序也是用的FindWindowEx这个函数,只不过没有指定类名罢了 能否给段代码参考一下?我这边一直搞不出来。目标程序就是在form上放置一个dxtreelist控件。麻烦你了 我现在是想试着从dxtreelist中读取单元格的数据,用hook注入,但是在这之前必须先获取这个控件的句柄,然后才能有下一步的操作 我的枚举子窗口代码就这么简单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; 谢谢ysai朋友,明天早上我再试一下你的代码,看看是否管用。 刚才试了一下ysai朋友的代码,用h:=FindWindowEx(handle,0,nil,nil);的形式来编写,还是一样,得不到希望的结果。因为我自己的delphi中没有安装dxtreelist控件,所以不知道会不会是这个问题:获取一个外部程序中某一个控件的句柄,是不是自己的delphi中也必须要安装这个控件?希望能有高手帮我解决这个问题。原先帖子的分低,现在又加了100分,还请高手门能不吝赐教! Delphi7.0调用VC写的动态库问题,请大侠帮忙 60分求DELPHI如何提取日期中的月份 关于输入法的一个问题! 如何判断文件正在被使用 这种过程怎么写阿?帮帮忙,谢了! 有个算法让我头大,哪位能帮个忙? 各位高手推荐几本学习Delphi好书,thanks,bow 高分提问,关于fastScript难题,请各路英雄出手相救!! 请问哪可下载Delphi6自带的Installshield Express的远东语言包? 请教:stringgrid如何显示记录信息? dbgrid排序问题 delphi 里的stringgrid控件 的事件顺序问题。。谢谢各位了
不知道Delphi 能不能根据 窗体句柄创建或得到TForm对象,,如果那样就可以使用 form1.controlcount 进行遍历了。。
等待高人!!
http://blog.csdn.net/zswang/archive/2008/07/13/2645555.aspx
类名大小写没写对?
要找的控件不是直接放在窗口中,而是放在容器控件中?我上传了一个工具 你可以用它先看看窗口结构
http://download.csdn.net/source/1299537
一步一步的调试一下,找到真正原因。
(是在没办法了,理论来讲如果句柄正确,FindWindowEx 应该可以搞定的。。)
一般SPY++能找到的就应该没有问题,问题都是自己的
不过SPY++是抓某个窗口的,我的程序可以抓整个窗口的可视控件结构,层次能看清楚
因为我的程序也是用的FindWindowEx这个函数,只不过没有指定类名罢了
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;