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 实战过程
1)CloseWindow 无效
只是最小化界面
2)DestroyWindow无效
通过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(彼时自然是在窗口的创建线程上)。
效果:该功能还是不行的,因为只有等弹窗出现了,才会销毁窗口,所以会看到弹窗一闪而过,远远没有达到要求,是否可以截获创建窗口的消息,然后防止分发的方式进行拦截,可能是一种有效的方法(目前设置1ms的定时计划,还是不行)
转载于:https://blog.51cto.com/fengyuzaitu/1727965