销毁其他进程的弹窗

1 场景说明

         针对很多软件弹出广告信息,影响工作效率,但是又无法关闭该软件,因为这样会导致失去该软件功能。尝试使用MFC,发送销毁的信息给关闭的窗口。

2 应用的知识

1)定时器,定时检测

SetTimer, OnTimer

2)根据窗口标题查找界面句柄

FindWindow

3)发送关闭消息给窗口

SendMessage

3 具体代码如下

void CCloseWindowsDlg::OnTimer(UINT_PTRnIDEvent)

{

 CString szWinTitleName[3]={"京东","腾讯新闻","腾讯大粤网新闻"};

  for(int i=0; i<3;i++)

  {

   HWND   hWnd;

   hWnd   =   ::FindWindow(NULL, szWinTitleName[i]);

   ::SendMessage(hWnd,WM_CLOSE,0,0);

  }

 CDialog::OnTimer(nIDEvent);

}

4 流浪历程

1CloseWindow 无效

只是最小化界面

2DestroyWindow无效

通过GetLastError函数发现,返回5,通过错误查找工具,提示信息:拒绝访问

   int nRet = ::DestroyWindow(hWnd);

   DWORD dwError = 0;

   if (nRet == 0)

    {

     dwError = GetLastError();

}

根据MSDN说明,不能在非创建线程上调用DestroyWindow;若要在其它线程上关闭窗口,不可以直接调用DestroyWindow(错误"拒绝访问"),也不可以只发送WM_DESTROY,因为DestroyWindow才能完整的关闭窗口,WM_DESTROY消息只是关闭流程的一部分,甚至是最"无用"的一部分--WM_DESTROY只是用户响应的接口,而真正清理窗口的工作由DestroyWindow的其它部分完成。

要在其它线程上关闭窗口,可以向窗口发送WM_CLOSE消息,若窗口过程未在WM_CLOSE的处理中取消关闭操作,则DefWindowProc会默认调用DestroyWindow(彼时自然是在窗口的创建线程上)。

 


你可能感兴趣的:(mfc,关闭弹窗,销毁窗口)