我实际只打开了4个窗口,但得到的iWndNums为什么会是100多个呢?
另外,在EnumWindowsProc函数中,我已经得到了窗口的句柄hwnd,我怎么把它转化为CWnd类型,以便对这个窗口操作呢?int iWndNums;
void CTestDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
// CWnd *pWnd;
iWndNums = 0;
LPARAM lmyParam = 0;
if(EnumDesktopWindows(NULL, (WNDENUMPROC)EnumWindowsProc,lmyParam))
AfxMessageBox("aa");
int a = iWndNums;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
 if(hwnd==NULL)
  { 
    return false; //结束枚举
  }
  //这个hwnd就是枚举到的当前窗体的句柄
  
  //统计窗口的数量
  iWndNums++;
  //继续枚举
  return true;
}

解决方案 »

  1.   

    BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    {
    //判断是否是主窗口句柄,因为一个进程不定只有一个主窗口哦
    if (GetWindowLong(hwnd,GWL_STYLE) & WS_VISIBLE) 
    {
    iWndNums++;}
     return true;
    }
      

  2.   

    要操作,HWND就够了,无法正确的转化为hwnd
      

  3.   

    对于HWND怎么操作呢?比如最小化窗口,改变窗口的大小等。在那里有它的操作文档呢?MSDN怎么找,谢谢了!
      

  4.   

    是CWindow类吗?
    用了你的那个判断后,得到的窗口数量明显少了。不过我只开了五个窗口,显示的是9个窗口,这是什么原因呢?劳驾,谢谢!!!
      

  5.   

    CWnd* pWnd = CWnd::FromHandle(hWnd);pWnd->DoSomething......
      

  6.   

    to whoo:
    可以了,我试了Attach,为什么会出错呢?(终止,重试,忽略的对话框)
    CWnd pWnd;
    pWnd.Attach(hWnd);
    pWnd.DoSomething...
    pWnd.Detach();
      

  7.   

    你也不需要将它转化为CWnd类型,如果你觉得用CWnd方便,可以使用
    static CWnd* PASCAL FromHandle( HWND hWnd );
    函数,它会给你一个临时CWnd对象,但是不能保存这个指针.MFC中,将CWnd与Hwnd进行了映射, 我们现在得到的hWnd是其他进程创建的窗口,所以在自己的程序中没有建立映射,因此,你就不能得到CWnd.
      

  8.   

    现在已经能够获得自己想要的窗口了,那么如何列举窗口中的所有控件呢?就像VB中的FOR EACH可以获得窗体上的所有控件的信息那样。