針對很多軟體彈出廣告資訊,影響工作效率,但是又無法關閉該軟體,因為這樣會導緻失去該軟體功能。嘗試使用MFC,發送銷毀的資訊給關閉的視窗。
1)定時器,定時檢測
SetTimer, OnTimer
2)根據視窗标題查找界面句柄
FindWindow
3)發送關閉消息給視窗
SendMessage
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);
}
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的定時計劃,還是不行)
本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1727965,如需轉載請自行聯系原作者