假如进程A的主线程(id是Ta)创建了一个窗口Wa,我怎么在进程B中获得线程Ta的主窗口句柄HWnd(Wa)?
我的想法是枚举线程Ta的所有窗口,找到一个风格为ws_popup的窗口,但是这样做是有问题的,
请问有何更好的方式没?

解决方案 »

  1.   

    只能反向比较:
    通过枚举顶层窗口,通过GetWindowThread函数来获得线程ID来比较
      

  2.   

    枚举窗口EnumWindows();然后通过GetWindowThreadProcessId()函数根据HWND得到进程ID,然后比较该进程ID是否和指定的进程A的ID相同
      

  3.   

    回复1,2楼
    我试过了EnumWindows,它枚举的顶层窗口满足不了我的要求,我要的是某线程的主窗口Wa,但是Enumwindows会将Wa创建的子窗口也给枚举出(比如DoModal了一个对话框,AfxMessageBox等)这些子窗口同主窗口时同一个线程的,反向获取它们的线程id也肯定是相同的,所以无法实现我的需求.还有什么办法没?
      

  4.   

    EnumWindows Function:
    The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window, in turn, to an application-defined callback function. EnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE. 
      

  5.   

     线程
    #include "CMWnd.h"  //class CMWnd 
    UINT B(ULONG 参数1,) 
    {
       CMWnd *pW;
       pW = (CMWnd *) 参数1;
       
       pW->xxxxxx;
    }
      

  6.   


    BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
    {
    if(hwnd==NULL)
    {
    return FALSE;
    }
    if (IsWindowVisible(hwnd))
    {
    CListCtrl* pList=(CListCtrl*)lParam;
    int nItem=pList->GetItemCount();.....
    //获得窗口标题
    CString strWindowText=_T("");
    ::GetWindowText(hwnd,strWindowText.GetBuffer(256),256);
    strWindowText.ReleaseBuffer();
    pList->SetItemText(nItem,1,strWindowText);
    }
    return TRUE;
    }void CTDlgDlg::OnBnClickedButton1()
    {
    CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST);
    pList->DeleteAllItems();
    pList->SetRedraw(FALSE);
    //枚举窗口
    ::EnumWindows(EnumWndProc,(LPARAM)pList);
    pList->SetRedraw();
    }以上是我的测试代码,
    假如Wa创建了一个弹出窗口,那么弹出窗口和主窗口,都被枚举了出来,它们在同一个线程中.
    所以这个时候反向获取id是没有办法区分哪个才是主窗口的.-----------------------------------
    现在看来貌似是没有办法区分主窗口了. 再等一晚,明天过来结贴.