我们知道,EnumWindows可以列举当前系统中的所有窗体句柄并调用用户自定义回调函数EnumWindowsProc。
问题来了:
当我得到一个窗体句柄,我如何判断这个窗体句柄对应的是不是这个程序的主窗体?
例如,当我们打开EXCEL时,系统中存在大约10个左右的句柄与之相关联。在这10个左右的HWND中,我怎么判断哪个是主窗体的句柄?我曾经考虑过使用GetParent和GetWindow来获取父窗体或OWNER,如果返回NULL,则表明当前这个句柄是主窗体的。但是在MyIE中有个例外:存在一个HWND,既不是主窗体,也没有父窗体或OWNER。请教高手,这个问题怎么解?(如果这个问题能够顺利解决,我可以另外开帖给解答者再加200分!)

解决方案 »

  1.   

    存在一个HWND,既不是主窗体,也没有父窗体或OWNER
    怎么会?
    难道是外星球来的
      

  2.   

    看看窗口是不是具有WS_EX_APPWINDOW
      

  3.   

    LPTSTR lpszDesktop= _T("Default");
    TCHAR szOutput[1024];
    HDESK hDesk = OpenDesktop(lpszDesktop, 0, FALSE, DESKTOP_ENUMERATE);
    if (hDesk == NULL)
    {
    wsprintf(szOutput, _T("OpenDesktop for %s Error: %d\n"), lpszDesktop, GetLastError());
    OutputDebugString(szOutput);
    return FALSE;
    } EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowProc, (long)this);
    }BOOL CALLBACK CSystemanalyzer::EnumWindowProc(HWND hWnd, LPARAM lParam)
    {
    if (!IsWindowVisible(hWnd))
    return TRUE;
    //加一些判断条件
    return TRUE;
    }
      

  4.   

    TO:wuxfBrave(升星了,休息休息)
    WS_EX_APPWINDOW能否唯一确定一个窗体是否为应用程序的主窗体?TO:smallcrocodile(大鳄鱼) 
    你可以称它为“主窗体”,但它并不是通常概念上的“主窗体”,或者说,它并不是一个应用程序的主界面。当我们运行EXCEL时,系统中存在大约10个左右相关的窗体句柄,其中有2个不具有父窗体:一个是EXCEL的主界面,另一个的GetWindowText是“DDE ……”。对于后者,如果你对它调用ShowWindow(hWnd, SW_RESTORE)的话,甚至会在任务栏上多出一个相应的项目。