现在我碰到一个问题:假设已知父窗口的句柄是:2229472,我需要查找父窗口下的子窗口为AfxMDIFrame70su类,没有标题。
但问题就在,父窗口下总共有三个AfxMDIFrame70su类,分别的句柄是:2098426,,,,1180862,,,2098292,,我所需要的是第二个(1180862这个句柄),我用findWindowsEx函数查找,但只能找到第一个(2098426这个句柄),是不是findWindowsEx只能查找符合条件的第一个子窗口啊,那我这个问题怎么解决呢,有办法吗?

解决方案 »

  1.   

    function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;
    var
      cName: array[0..180] of Char;
      wName: array[0..32] of Char;
      tHandle: Longword;
    begin
      result := true;
      GetClassName(hwnd, cName, 32);    {类名}
      GetWindowText(hwnd, wName, 180);  {窗口名}
      tHandle := GetWindowLong(hwnd, GWL_STYLE); {判断窗体是否可见}
      if (WS_VISIBLE and tHandle) > 1 then
      Form1.Memo1.Lines.Append(IntToStr(hwnd)+ Chr(2) + StrPas(cName) + chr(2) + StrPas(wName));
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    EnumWindows(@EnumWindowsProc, 0);
    end;
      

  2.   

    >>那个是遍历窗口的啊,我需要的是父窗口下的子窗口,而且是第二个,
    在遍歷中也可找到你要的東西正常用 findWindowsEx 應該是可以的, 你說不行, 有點奇怪
      

  3.   

    对啊,我用findWindowsEx查找的时候,,老是找到2098426这个句柄,所以我想是不是findWindowsEx是不是只能查找符合条件的第一个子窗口,如果我要查找符合条件的第二个呢?
      

  4.   


    AAA=findWindowsEx(主窗口HWND,0,‘AfxMDIFrame70su’,NIL);
    找到第1个AfxMDIFrame70su类的控件句柄,
    然后从得到的句柄再找起。
    BBB=findWindowsEx(主窗口HWND,AAA,‘AfxMDIFrame70su’,NIL);这个BBB就是第2个的句柄了。看看findWindowsEx的介绍,这100分不就省了么
      

  5.   

    使用GetWindow可以实现,具体用法请看帮助
      

  6.   

    同意 DemonLoveLizzy(▲▲▲▲▲) ( 
    FindWindowEx的第二个参数把第一次找到的传进去。。
      

  7.   

    搞定,,原来FINDWINDOWSEX的用法是,AAA=findWindowsEx(主窗口HWND,0,‘AfxMDIFrame70su’,NIL);
    BBB=findWindowsEx(AAA,0,‘AfxMDIFrame70su’,NIL);和DemonLoveLizzy(▲▲▲▲▲) 兄说的还是有些差异哦。给分!
      

  8.   

    //和DemonLoveLizzy(▲▲▲▲▲) 兄说的还是有些差异哦。我说的才是正确的用法。你应该可以想到的,一个函数里不可能有根本用不到的参数。