容隐蔽窗口,系统托盘等技术一体的关闭广告程序剖析(源码)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

广告是叫人深恶痛绝的东东(可能商家不这样想),INTERNET也逃不了它的影子。于是各种KILL广告的软件层出不穷,但它们的原理基本都一样,就是用软件判断弹出是窗口是否是广告,是的话就KILL掉,不是就跳过。实现起来也相当简单,核心部分,几行就可以搞定.当然,这并不包括后面要说的隐蔽窗口和托盘技术的实现。(VC++)

先说核心,关广告。(用于IE浏览器)

因为WINDOWS管理窗口是分层的,像目录树一样。而广告往往是IE浏览器派生的子窗口。所以我们用循环方法找到所有窗口,获得窗口句柄,当得知是IE时,再进一步获得该IE的子窗口,然后判断是否是广告。至于如何判断,我们也用最简单的方法,就是看该窗口风格(比如:是否有工具栏)。

下面是代码实现:

void cmywnd::OnTimer(UINT nIDEvent)

{

先获得WINDOWS中第一个窗口句柄:

CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);

进入循环

while (pMainWnd)

{ 该名字用于判断是否是IE浏览器

CString IEName;

获得该窗口的名字并放入IEName中

GetClassName(pMainWnd->m_hWnd,IEName.GetBufferSetLength(100),100);

IE名字是IEFrame,所以判断该名是否于等于它

if(IEName=="IEFrame"){

是的话,获得子窗口句柄

CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerW",NULL));

if(pChildWnd)

{

如果子窗口存在,获得它的风格,如果满足条件,就给它发消息关闭它。

if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))

{

pMainWnd->PostMessage(WM_CLOSE,0,0);

}

}

}

继续获得下一个窗口句柄

pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);

}

CWnd::OnTimer(nIDEvent);

}

核心就是这些,把上面代码加到程序中就可以实现关广告的目的了。

但作为一个关广告程序,我们并不希望该程序太明显,也就是说程序越隐蔽越好,于是我们想到用隐蔽窗口,并用系统托盘管理。实现方法也相关简单,就是自创一个窗口类,并派生于CWnd,定义如下:

class cmywnd : public CWnd

{

public:

托盘图标

HICON m_hicon;

托盘菜单

HMENU menu1;

public:

void create(LPCTSTR pTitle,RECT &rect,unsigned short MaskID,unsigned short BitmapID,HICON hicon,HMENU hmenu);

}

就一个成员函数create,参数也相当明了,不用解释了吧,实现如下:

void cmywnd::create(LPCTSTR pTitle, RECT &rect, unsigned short MaskID, unsigned short BitmapID, HICON hicon, HMENU hmenu)

{

调用API创建一个隐蔽窗口

CreateEx(0,AfxRegisterWndClass(0),pTitle,WS_OVERLAPPEDWINDOW|WS_SYSMENU,rect,NULL,NULL,NULL);

图标与菜单设置

menu1=hmenu;m_hicon=hicon;

SetIcon(hicon,TRUE);

SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

设置托盘的一些属性

NOTIFYICONDATA nid;

nid.cbSize=sizeof(NOTIFYICONDATA);

nid.hWnd=this->m_hWnd;

nid.uID=1;

nid.uFlags=NIF_TIP|NIF_ICON|NIF_MESSAGE;

nid.uCallbackMessage=WM_SYSCOMMAND;

nid.hIcon=hicon;

strcpy(nid.szTip,"去广告,赵明个人软件!");

Shell_NotifyIcon(NIM_ADD,&nid);

}

以上就是隐蔽窗口和系统托盘的实现,要在程序中使用,也相当简单,调用create函数就可以了,如下:

cmywnd* pFrame=new cmywnd;

其中的参数,视你程序而定

pFrame->create("eyes",rect,IDI_ICON1,IDI_ICON1,hicon,hmenu);

整个"关广告"程序剖析完了,接下来的工作,你只要把它们用到一起就行了。至于你怎么用,就看你了,我这有一个源程序,如果你有兴趣,发E给我啦。

网址:http://h2osky.126.com

赵明

email: papaya_zm@sina.com;zmpapaya@hotmail.com

web: http://h2osky.126.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航