项目需要,调用并控制第三方的一个程序。我已经用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发送控制消息。

解决方案 »

  1.   

    用EnumChildWindows函数枚举是没有问题的,只要你能用spy++看到,就一定可以遍历到。
      

  2.   

    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;
      

  3.   

    在EnumChildWndProc定义后面加stdcall,从贴的这些代码代码来看没什么其他问题。
      

  4.   

    定义已经加了。
    另外,从sky++上也看不到那4个子窗口中的子控件。那还有别的方法吗?
      

  5.   

    看不到的话,那可能是自定义或者自画的控件,也有可能是ATL
    如果是这样,估计只能通过WH_message来看看了
      

  6.   

    6楼的兄弟:看不到的话,那可能是自定义或者自画的控件,也有可能是ATL
    如果是这样,估计只能通过WH_message来看看了
    请问如何通过WH_MESSAGE来看看,能详细说明一下吗?
      

  7.   

    各位大虾,WH_MESSAGE如何使用?