欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

“QQ反骚扰”开发手记

程序员文章站 2022-04-07 09:39:31
呆在家中上网聊天实在不是一件惬意的事:每一天打开QQ,迎接我的都是一串一串的广告……国庆黄金周,连广告也不放过!:( 无奈,打开Visual C++,开始了我的“反... 09-05-24...

呆在家中上网聊天实在不是一件惬意的事:每一天打开qq,迎接我的都是一串一串的广告……国庆黄金周,连广告也不放过!:(
无奈,打开visual c++,开始了我的“反骚扰”之路。

首先我面对的问题是:qq一共有几种广告,我能用什么方法消灭它们?

前半个问题很好回答,相信所有常q的朋友都知道。qq的广告有三种:第一种是在系统消息中的弹出式flash广告,第二种是直接弹出的flash广告(窗体非常花哨),第三种是以系统广播形式出现的文字式广告。

对于后半个问题,我给出的答案是:在广告对应的窗体上,都有相应的按钮可以将其关闭,点击即可。

不是吧,就这么简单?也许你要这么问。

是的,不过我是说,让我的“qq反骚扰”帮助我点击这些按钮。即在取得这些按钮的句柄后,向该按钮发送一个单击消息,如下代码所示:

sendmessage( hbutton, bm_click, 0, 0 );


也许会有朋友问,为什么不直接将对话框消灭掉,即:

enddialog( hdialog, true );


问得好!具体原因是……呵呵,我也不知道:)但我能告诉你的是,你可以将我的代码换成上面那一句,效果可能不会很理想的,因为我试过。另外,有很多的共享软件点击器之所以叫“点击器”就是这个道理。单单消灭这个窗口,很可能由该窗口占用的一些系统资源就会流失,相比之下,还是使用点击的方法,让对话框自己调用它回调函数中的退出部分来消灭对话框,岂不是更加安全?

还有一个问题:什么时候让它去点击呢?或者说,它怎么知道什么时候去点击呢?

我的答案是:时刻监视。

是了,这就是我在软件的readme.txt中所说的“计时器技术”了。很简单,只需在对话框的初始化中加入如下代码:

settimer( hdlg, 1, 100, null );


第一个参数是需要设置计时器的对话框句柄,使用mfc的朋友可以省略这个参数;第二个参数是计时器的id;第三个是计时器事件的触发时间间隔(以微妙为单位);第四个参数可以指定响应事件的回调函数,这里用不着,为null。

这样,便可以实现初步的功能——时刻监视了。但是在最后处理程序退出部分的代码时,一定要将先前创建的计时器销毁,即:

killtimer( hdlg, 1 );


因为计时器是一个耗费系统资源的东西,所以在程序结束的时候,必须销毁它以释放系统资源。

下面我来开始介绍如何来在内存中寻找qq的三种广告窗口。以下的代码我均摘自“qq反骚扰”的sdk源代码,请使用mfc的朋友们自行做出相应的改动。

在内存中有很多窗口,那么“qq反骚扰”又是如何知道哪一个窗口是qq的广告窗口呢?很简单,从窗口所具备的众多特征中取出两到三个来作为“过滤器”即可。比如对于系统消息的弹出式广告,它的“过滤器”就是它的标题——“腾讯qq系统广播”和它的“关闭”按钮。

这样,在处理计时器事件时的代码如下: