天天看點

銷毀其他程序的彈窗

         針對很多軟體彈出廣告資訊,影響工作效率,但是又無法關閉該軟體,因為這樣會導緻失去該軟體功能。嘗試使用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,如需轉載請自行聯系原作者