例如,写一个函数
HWND getMainWin(DWORD idProcess,int &type)输入参数是一个进程的id。功能:1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回3以上的需求能做到么,有哪点是做不到的? 如果能做到,大概需要怎么做?谢谢,请讨论和指教。100分。

解决方案 »

  1.   

    输入参数是一个进程的id。功能:1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
    2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回
    ==============================
    对一个进程来说,它可能有多个窗口,而且这个多个窗口之间的关系并不一定是父子关系,这样的话,你所说的主窗口就无从谈起了,因为可能有多个窗口都算是主窗口。
      

  2.   

    EnumWindows + GetWindowThreadProcessId + GetClassName
    要找出主窗口,有点难
      

  3.   

    to 1L:
    因为是这样,我觉得不论dialog,sdi,mdi,创建了一个最顶层的窗口以后,其他的窗口在创建的时候一般都要指定父窗口。假设程序里面其他的窗口对象在创建的时候,都严格指定了顶层窗口作为父窗口。
    那么枚举函数之类的调用,第一个返回的是否可以肯定是这个顶层窗口呢?请继续指教。
      

  4.   

    你这里所说是是一种假设的情况,但是实际上,很多程序并不是这样的。
    如果基于你这种假设,那么上面说的:
    EnumWindows + GetWindowThreadProcessId + GetClassName
    这三个API基本上能满足你的要求,但是枚举窗口时第一个窗口是不是一定就是顶层窗口,这个可能不一定,没试过,不太好说。
      

  5.   

    EnumWindow以及它的参数WNDENUMPROC,似乎都不接受ProcessID啊。
    我的问题是,如何枚举另一个进程id所指向的,窗口。可以做到么。
      

  6.   


    BOOL EnumWindows(          WNDENUMPROC lpEnumFunc,
        LPARAM lParam
    );BOOL CALLBACK EnumWindowsProc(          HWND hwnd,
        LPARAM lParam
    );EnumWindows(EnumWindowsProc,(lParam)idProcess);
      

  7.   


    // 根据ID找到窗口句柄
    typedef struct _WNDINFO_
    {
    HWND hWnd;
    DWORD dwProcessId;
    }WNDINFO, *PWNDINFO;BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
    {
    WNDINFO* pInfo = (WNDINFO*)lParam;
    DWORD dwProcessId = 0;
    GetWindowThreadProcessId(hWnd, &dwProcessId);
    if(dwProcessId == pInfo->dwProcessId)
    {
    pInfo->hWnd = hWnd;
    return FALSE;
    }
    return TRUE;
    }HWND GetProcessMainHwnd(DWORD dwProcessId)
    {
    WNDINFO info = {0};
    info.dwProcessId = dwProcessId;
    EnumWindows(EnumWindowProc, (LPARAM)&info);
    return info.hWnd;
    }