您的位置:首页 > 其它

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

2002-11-10 11:45 537 查看
广告是叫人深恶痛绝的东东(可能商家不这样想),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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: