我在做一个过滤IE 广告窗口的小程序,是为了练习WINDOWS编程. 以下是我的程序核心代码,能找到要关闭的IE窗口的代码,但是不能关闭它,各位老大,请帮忙看看.  void CIePopWndDlg::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default
HWND IeWnd=NULL, TempWnd;
//CWnd *MainFrameWnd;
CString strClassName;
int WndClassNameLength;
    TempWnd=::GetForegroundWindow();//获得用户当前工作的窗口的句柄
IeWnd=TempWnd;
    //TempWnd=MainFrameWnd->FromHandle(
if(::IsWindow(TempWnd))
         WndClassNameLength=GetClassName(IeWnd,strClassName.GetBufferSetLength(100),100);//取得窗口类名长度
strClassName.Left(WndClassNameLength);//获得窗口类名
      if(strClassName=="IEFrame")
  {   //AfxMessageBox("窗口是ie窗口");
  HWND ChildWnd;
  if((GetWindowLong(IeWnd,GWL_STYLE)&WS_MAXIMIZEBOX))
  {
  do
  {
ChildWnd=FindChildWnd(TempWnd);
                TempWnd=ChildWnd;
  }
  while(::IsWindow(ChildWnd)&&ChildWnd==NULL);
  }
  else
  {  
  CWnd* pTempWnd=CWnd::FromHandle(IeWnd);//获得要销毁的窗口指针
  AfxMessageBox("窗口是无最大化按钮");
  pTempWnd->PostMessage(WM_CLOSE,0,0);
  //::DestroyWindow(IeWnd);
  //::closehandle(IeWnd);
  //::SendMessage(IeWnd,WM_DESTROY,NULL);
  //发现是弹出广告窗口就发送销毁窗口的消息
               
  }
  }
CDialog::OnTimer(nIDEvent);
}
/////////////////////////////////////////////////////////////////////////////
pTempWnd->PostMessage(WM_CLOSE,0,0);
::DestroyWindow(IeWnd);  
::closehandle(IeWnd);  
::SendMessage(IeWnd,WM_DESTROY,NULL);以上四个函数我都试过了都不能销毁那个已经找到句柄且要销毁的窗口, 请大家帮帮忙

解决方案 »

  1.   

    A thread cannot use DestroyWindow to destroy a window created by a different thread.
    如果要发送消息,因为你不知道目标窗口是如何处理该消息的,不是很好.我唯一能想到的办法就是强制关闭创建该窗口的线程,不过这好像很难办到!呵呵!
      

  2.   

    IE的窗口一般来有四级子窗口,用spy++你可能看见,在得到那个最上面的窗口(主窗口)句柄后,使用PostMessage,发送WM_CLOSE是可以关上它的.建议直接使用API的PostMessage而不是用CWnd的.
      

  3.   

    你现在是对子窗口发的WM_CLOSE,应该对顶级窗口发,即类名为IEFrame的那个
    void CIePopWndDlg::OnTimer(UINT nIDEvent) 
    {
    HWND IeWnd=NULL, TempWnd;
    CString strClassName;
    int WndClassNameLength;
        TempWnd=::GetForegroundWindow();//获得用户当前工作的窗口的句柄
    IeWnd=TempWnd;
         if(::IsWindow(TempWnd))
             WndClassNameLength=GetClassName(IeWnd,strClassName.GetBufferSetLength(100),100);//取得窗口类名长度
    strClassName.Left(WndClassNameLength);//获得窗口类名
          if(strClassName=="IEFrame")
                        PostMessage(IeWnd, WM_CLOSE,0,0);
    }