C++Builder 高手進階 (一)編寫彈出廣告殺手 (轉)

worldblog發表於2007-12-15
C++Builder 高手進階 (一)編寫彈出廣告殺手 (轉)[@more@] 

 C++Builder 高手進階  :namespace prefix = o ns = "urn:schemas--com::office" />

(一)  編寫彈出廣告殺手

nxyc_twz@163.com

一、分析

  作為一名開發人員,必然會經常上網查詢資料,可討厭的廣告真讓人心煩。有沒有辦法自動關閉這些廣告呢?答案是肯定的!也許你會說:“網上這類軟體多的是,隨便找一個不就行了?”,你說的確實不錯,可作為一名軟體開發人員,總不能什麼都靠別人吧?自己動手作一個如何?說幹就幹,首先得找出彈出廣告視窗的工作原理:

1.  使用自己的《系統視窗分析器》(在下一期講述其開發過程),輕易地就發現彈出廣告視窗的特徵:其視窗類是CabWClass或IEFrame。

2.  如果找出視窗類是CabinetWClass或IEFrame的視窗,向其傳送WM_CLOSE不就OK了嗎?心裡不由一陣竊喜!

3.  使用定時器定時進行檢測,找到符合條件的視窗就向其傳送WM_CLOSE訊息。

二、實戰前沿

道理講明瞭,可如何找到視窗類名呢?這就需要使用了:

GetWindowText :取得視窗文字

GetWindow  :取得視窗控制程式碼

GetClassName :取得類名

PostMessage :傳送訊息

SetWindowLong :設定方式

具體用法請查閱相關資料。

三、設計流程

1.  啟動C++Builder 5,新建一個Application,將Form的Name設定為Form1,其BoldStyle設定為bsNone,在Form的Icon中設定好圖示。

2.  定義資料變數:

TRAYICON_ID = 1;

ICONEVENT = WM_APP + 100;

TNotifyIconData  TrayIcon ;

3.  拖放一個Timer和一個Popmenu控制元件到窗體上。Timer的屬性:Name->Timer1,Interval->1000;Popmenu1上追加三個子項:繼續->ContinueCmd,PauseCmd->暫停,ExitCmd->退出。

4.  使應用進入系統托盤:void  TrayIconCmd(void);

TrayIcon.cbSize = sizeof(TNotifyIconData);

TrayIcon.hWnd = Handle;

TrayIcon.uID = ID_TRAYICON;

TrayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;

TrayIcon.uCallBackMessage = ICONEVENT;

TrayIcon.hIcon = Form1->Icon->Handle;

TrayIcon.szT= “廣告視窗殺手”;

_NotifyIcon(NM_ADD, &TrayIcon);

5.  使應用程式退出系統托盤:void  TrayIconExit(void);

Shell_NotifyIcon(NIM_DELETE, &TrayIcon );

6.  使應用程式啟動後直接進入系統托盤:編寫Form1的OnCreate事件

TrayIconCmd();  //在系統托盤中圖示

Width = 0;

   SetWindowLong(Application->Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);

7.  從系統托盤中解除安裝圖示:編寫Form1的OnClose事件

TrayIconExit();

8.  自定義訊息TrayIconOnClick:

在頭.h中定義:

private:

MESSAGE  void  __fastcall  TrayIconOnClick(Tmessage &message);

BEGIN_MESSAGE_MAP

  MESSAGE_HANDLER(ICONEVENT, Tmessage, TrayIconOnClick);

END_MESSAGE_MAP(Tform)

9.  滑鼠點選系統托盤圖示(TrayIconOnClick),則彈出選單:

Tpoint  p;

if( message.lParam == WM_LBUTTONDOWN ||

  message.lPram == WM_RBUTTONDOWN)

{

PopupMenu1->PopupComponent = Form1;

  SetForegroundWindow(Handle); 

GetCursorPos(p);

  PopupMenu->Popup(p.x,p.y);

10.  列舉指定視窗控制程式碼的所有子視窗:void  MENumChild(HWND  hand);

char  tempstr[255];

bool  IsPopWindow = true;

HWND  h = GetWindow(hand, GW_CHILD);

while(h)

{

  GetClassName(h, tempstr, 256);

  if( !strcmp(tempstr, “WorkerA”) || !strcmp( tempstr, “WorkerW”))

  if( IsWindowVisible(h) ) IsPopWindow = false;

h = GetWindow(h, GW_HWNDNEXT);

}

if( IsPopWindw )PostMessage(hand, WM_CLOSE, 0, 0);  

11.  雙擊Timer控制元件,新增其事件OnTimer:

char  Text[255];

HWnd  h := GetWindow(Handle, GW_HWNDFIRST);

while(h)

{

  if (GetWindowText(h, Text, 255) > 0)

  if (GetClassName(h,Text , 255)>0)

  if ( !strcmp( Text, “CabinetWClass”) || !strcmp(Text, “IEFrame”))

  EnumChildWindows(h);

  h  = GetWindow(h, GW_HWNDNEXT);

}

12.編寫選單響應事件:

ContinueCmd:繼續

Timer1->Enabled = true;

  PauseCmd->Checked = false;

   ContinueCmd->Checked = true;

PauseCmd:暫停

Timer1->Enabled = false;

   PauseCmd->Checked = true;

   ContinueCmd->Checked = false;

ExitCmd::退出

Close();

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993954/,如需轉載,請註明出處,否則將追究法律責任。

相關文章