程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 讓彈出式廣告就地正法

讓彈出式廣告就地正法

編輯:Delphi
   每當我浏覽網站的時候,那撲面而來的廣告窗口總是弄得我心煩意亂.我下定決心要自己編一個查殺廣告的程序.經過我的觀察,發現了廣告窗口和正常IE窗口的區別主要在於廣告窗口沒有標題欄和狀態欄(其實它們也有,如果你不明白,請繼續往下看!)
      祭出我自編的軟件-探索者(其實只不過是窗口類的顯示器,當然也能看密碼),發現正常浏覽窗口的類名是IEFRAME和CabinetWClass,而廣告窗口的類名是CabinetWClass,聽說在Windows2000中也是IEFrame(未經證實).其實是什麼都無所謂,只要在程序中查找這兩個類就可以了.
      procedure TForm1.Timer1Timer(Sender: TObject);
      var
        mainHD,WorkAHD:THandle;
      begin
      //  Kill  AD.
      mainHD:=FindWIndowEx(0,0,'CabinetWClass',nil);
      if Mainhd<>0 then
        begin
          WorkAHD:=FindWindowEx(Mainhd,0,'WorkerA',nil);  ////WorkerA類,具體關聯見下圖
          if WorkAHD=0 then PostMessage(Mainhd,WM_CLOSE,0,0);
        end;
     end;
     通過在Timer事件中調用FindWindowEx函數可以查找到運行窗口的句柄,具體介紹請見Delphi的Win32 API幫助.
     當我滿心歡喜的運行程序時卻發現廣告窗口一如往常的彈出,哪裡出了錯?繼續祭出我的"探索者",先把IE浏覽器的框架結構搞清楚,功夫不負有心人,經過一下午的時間,終於讓我找到了:

  

     調試,卻發現原來廣告窗口同樣具有上圖的結構,這也讓我的程序設計進程停滯不前,經過兩個晚上的思考,我終於想到另一個API函數:GetWindowRect,它可以得到一個窗口的物理尺寸結構.馬上調試,終於發現:
     1.廣告窗口的WorkerA類和Shell DocObject VIEw類的rect.top的值是相同的;
     2.正常IE窗口的WorkerA類和Shell DocObject VIEw類的rect.top的值是不相同的;
     馬上更改代碼,代碼如下:
     procedure TForm1.Timer1Timer(Sender: TObject);
     var
       mainHD,WorkAHD,VIEwHD:THandle;
       y_workA,y_vIEw:integer;
       rect1,rect2:TRect;
     begin
       //  Kill  AD.
       mainHD:=FindWIndowEx(0,0,'CabinetWClass',nil);
       if Mainhd<>0 then
       begin
          WorkAHD:=FindWindowEx(Mainhd,0,'WorkerA',nil);
          GetwindowRect(WorkAHD,rect1);
          y_workA:=rect1.top;
          ViewHD:=FindWindowEx(mainHD,0,'Shell DocObject VIEw',nil);
          if vIEwHD<>0 then    ////注1:
          begin
            GetwindowRect(VIEwHD,rect2);
            y_vIEw:=rect2.top;
            if y_VIEw-y_WorkA<5 then PostMessage(Mainhd,WM_CLOSE,0,0);
          end; 
       end;
     end;
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved