如何得到前一个激活窗体的句柄?比如,有a和b两个窗口,当前a是激活的窗口,然后点击b,此时b变为激活窗口,请问此时在b程序中如何得到a的窗口句柄?

解决方案 »

  1.   

    如两窗口是独立的应用程序可用FindWindow得到句柄
      

  2.   

    a程序不一定是我创建的,我的意思是如何得到刚刚被deactived的那个窗口的句柄??
      

  3.   

    没有直接的API函数,不过可以用Findwindow或者EnumWindows找到句柄
      

  4.   

    截获WM_ACTIVATE这个消息试试
    MSDN:
    lParam
    Handle to the window being activated or deactivated, depending on the value of the wParam parameter. If the low-order word of wParam is WA_INACTIVE, lParam is the handle to the window being activated. If the low-order word of wParam is WA_ACTIVE or WA_CLICKACTIVE, lParam is the handle to the window being deactivated. This handle can be NULL. 
      

  5.   

    FindWindow/EnumWindow()就可以了找到
      

  6.   

    EnumWindow第二个窗口,不是吧,我测试了下,不是这样的!
      

  7.   

    EnumWindow第二个窗口确实不是,我也验证了。
      

  8.   

    这个问题我也很感兴趣,希望有经验的给点提示。我一般是在鼠标第一次移入我自己程序的窗口时(此时自己的程序还没有被激活)记录下现在的前景窗口。
    HWND PreWnd;LRESULT CDemoDlg::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
    m_IsInWindow=false;
    //Add your code
    trace("leave");
    return 0;
    } void CDemoDlg::OnMouseMove(UINT nFlags, CPoint point) 
    { if (!m_IsInWindow)
    {
    m_IsInWindow = TRUE;
    TRACKMOUSEEVENT trackmouseevent;
    trackmouseevent.cbSize = sizeof(trackmouseevent);
    trackmouseevent.dwFlags = TME_LEAVE;
    trackmouseevent.hwndTrack = GetSafeHwnd();
    trackmouseevent.dwHoverTime = HOVER_DEFAULT;
    _TrackMouseEvent(&trackmouseevent); //handle move in event
    PreWnd=::GetForegroundWindow();
    }
    CDialog::OnMouseMove(nFlags, point);
    }
      

  9.   

    当然我上面说的方法很有局限性。比如我自己窗口只能用鼠标激活才可以。如果用ALT-TAB激活就捕获不了前一个窗口了
      

  10.   


    我来试下这个方法,全局钩子不到真没办法的时候还是没想到要用。刚看到有这个一个消息WM_ACTIVATEAPP,似乎可以,但还没有详细研究
      

  11.   

    EnumWindow枚举窗口的顺序就是z序
    第一个应该是自己
    第二个不就是上一个拥有焦点的窗口么
    你们是怎么试的?
      

  12.   


    不行啊!刚刚试了一下,这个消息是在不同程序之间切换时就收到的,但激活自己窗口时收不到前一个窗口的信息,线程ID为NULL
      

  13.   

    第一个窗口确实是自己的,但第二个不一定是自己的。
    枚举后的窗口表是基本不改变顺序的。
    比如
    我激活A窗口,再激活自己的窗口,再调用枚举,窗口列表是:: 自己窗口--A窗口--B窗口--C窗口
    然后再激活B窗口,再激活自己的窗口,再调用枚举,窗口列表依旧是 ::自己窗口--A窗口--B窗口--C窗口
      

  14.   

    afx_msg void OnSetFocus(
       CWnd* pOldWnd 
    );
    这个pOldWnd就是失去焦点(从激活状态变为未激活)的那个窗口的句柄了. 你在b程序中添加WM_SETFOCUS消息响应函数, 就可以得到pOldWnd了
      

  15.   


    这个我也作了测试,线程ID是有空为NULL
      

  16.   


    这个需要你记录激活窗口的历史记录,使用鼠标肯定不对,应为tab也是可以切换窗口的。
    Enumwindow也不对。如果是本进程的窗口,还好办,如果是其他进程的窗口,难!不知道楼主想干什么!
      

  17.   

    本进程:WM_SETFOCUS肯定是可以的。