枚举子窗口,进行不下去了

wzn0521 2010-12-29 08:46:08
项目需要,调用并控制第三方的一个程序。我已经用FindWindow查找到程序运行后的窗口,获得了句柄,并准备继续枚举窗口里面的子窗口,代码如下:

procedure TForm1.Button3Click(Sender: TObject);
var
FindWindowThread : TFindWindowThread;
FEditWindow,h : integer;
begin
FindWindowThread := TFindWindowThread.Create(false,FDesktop);
try
FindWindowThread.WaitFor;
FMainWindowHandle := FindWindowThread.WindowHandle;
finally
FindWindowThread.Free;
end;
if FMainWindowHandle = 0 then begin
MessageBox(Application.Handle,'Error when init voice (6).',PChar(Application.Title),MB_ICONWARNING);
exit;
end;
//
ShowMessage(IntToHex(FMainWindowHandle,2));
EnumChildWindows(FMainWindowHandle,@EnumChildWndProc,0);

h := FindWindowEx(FMainWindowHandle,0,nil,PChar('IVA Configuration Menubar.vi'));
Memo1.Lines.Add('**********这是菜单栏目**********');
EnumChildWindows(h,@EnumChildWndProc,0);
//ShowMessage(IntToHex(h,2));
h := FindWindowEx(FMainWindowHandle,0,nil,PChar('IVA Product Inspection View 1.vi'));

Memo1.Lines.Add('**********这是显示流程那个栏目**********');
EnumChildWindows(h,@EnumChildWndProc,0);
//ShowMessage(IntToHex(h,2));
h := FindWindowEx(FMainWindowHandle,0,nil,PChar('IVA Configuration Tools Palette.vi'));

Memo1.Lines.Add('**********这是制作流程那个栏目**********');
EnumChildWindows(h,@EnumChildWndProc,0);
//ShowMessage(IntToHex(h,2));
h := FindWindowEx(FMainWindowHandle,0,nil,PChar('IVA Product Inspection Functions.vi'));

Memo1.Lines.Add('**********这是流程那个栏目**********'); //
EnumChildWindows(h,@EnumChildWndProc,0);
//ShowMessage(IntToHex(h,2));

Memo1.Lines.SaveToFile('abc.txt');
end;


我能确定下面4个是窗口中的部分子窗口(sky++查看到的),执行的结果如下:


$$ IMAQ Display View
$$ ScrollBar
$$ ScrollBar
$$ ScrollBar
$$ AfxWnd70s
IVA Product Inspection View 1.vi $$ LVDChild
IVA Thumbnail Browser.vi $$ LVDChild
IVA Configuration Tools Palette.vi $$ LVDChild
IVA Configuration Menubar.vi $$ LVDChild
IVA Product Inspection Functions.vi $$ LVDChild
**********这是菜单栏目**********
**********这是显示流程那个栏目**********
**********这是制作流程那个栏目**********
**********这是流程那个栏目**********



以上可以看到,我也找到了这4个子窗口的句柄,但继续找这4个子窗口中的子窗口的时候,却什么都找不到了。

经网上查询,LVDChild是非标准的windows窗口,请问我该如何继续进行下去?

找不到控件的句柄,意味着我无法用SendMessage发送控制消息。
...全文
272 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzn0521 2011-01-01
  • 打赏
  • 举报
回复
各位大虾,WH_MESSAGE如何使用?
  • 打赏
  • 举报
回复
把你的回调函数贴出来啊,要不怎么知道什么问题
无条件为你 2010-12-29
  • 打赏
  • 举报
回复
用EnumChildWindows函数枚举是没有问题的,只要你能用spy++看到,就一定可以遍历到。
wzn0521 2010-12-29
  • 打赏
  • 举报
回复
6楼的兄弟:看不到的话,那可能是自定义或者自画的控件,也有可能是ATL
如果是这样,估计只能通过WH_message来看看了


请问如何通过WH_MESSAGE来看看,能详细说明一下吗?
zhuimeng321 2010-12-29
  • 打赏
  • 举报
回复
顶!!!!!!!!!
gyk120 2010-12-29
  • 打赏
  • 举报
回复
看不到的话,那可能是自定义或者自画的控件,也有可能是ATL
如果是这样,估计只能通过WH_message来看看了
wzn0521 2010-12-29
  • 打赏
  • 举报
回复
定义已经加了。


另外,从sky++上也看不到那4个子窗口中的子控件。

那还有别的方法吗?
  • 打赏
  • 举报
回复
在EnumChildWndProc定义后面加stdcall,从贴的这些代码代码来看没什么其他问题。
wzn0521 2010-12-29
  • 打赏
  • 举报
回复
function EnumChildWndProc(AhWnd:LongInt;AlParam:lParam):boolean;
var
lpszClassName,lpszWindowText:array[0..254] of char; //定义两个缓冲区。
begin
GetWindowText(AhWnd,lpszWindowText,254); //得到窗口标题
GetClassName(AhWnd,lpszClassName,254); //得到窗口类名。
Form1.memo1.lines.add(StrPas(lpszWindowText) + ' $$ ' + StrPas(lpszClassName));
Result:=True;
end;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧