“QQ反骚扰”开发手记

  发布时间:2009-05-24 00:16:47   作者:佚名   我要评论
呆在家中上网聊天实在不是一件惬意的事:每一天打开QQ,迎接我的都是一串一串的广告……国庆黄金周,连广告也不放过!:( 无奈,打开Visual C++,开始了我的“反骚扰”之路。 首先我面对的问题是:QQ一共有几种广告,我能用什么方法消灭它们?


就这样,这个广告也被我征服了。其实最困扰我的是第三种广告——QQ号为10000的广告。我之所以把它称为“QQ号为10000的广告”,就是因为我的“过滤器”就是“10000”。这种广告和“用户????????将你列入好友名单”的系统信息是一样的,所以一不小心就会将重要的信息过滤掉。于是我选中了“10000”作为我的过滤器。

起先我从对话框的外观上判断,写有用户QQ号的控件是一个只读(ES_READONLY)的编辑框(Edit),后来我如法炮制代码并编译运行,发现无效!于是“QQ反骚扰”的版本号定为1.SVOF.02,共能消除两种的QQ广告。于是我似乎消沉了。不过偶然的一天,在我使用eXeScope研究另一个软件的时候,我才突然想出了用eXeScope这位专家来研究一下QQ的主程序的办法,然而能否成功,我心里没底。

我打开QQ的主程序,找到那个对话框,发现有很多的Static(静态文本,Delphi及C++ Builder中的Label)!我的天,我怎么没有想到那是改变了风格的Static呢?于是乎三下五除二,我的最后一段代码也问世了:

HWND hWndYw, hBtnClose3, hEdit;
hWndYw = FindWindow( NULL,"系统消息" );
if ( hWndYw != NULL )
{
hBtnClose3 = FindWindowEx( hWndYw, NULL, "Button", "返回" );
hEdit = FindWindowEx( hWndYw, NULL, "Static", "10000" );
if ( hEdit != NULL && hBtnClose3 != NULL )
SendMessage( hBtnClose3, BM_CLICK, 0, 0 );
}


你可以看到,在我的代码中,标识那个Static的句柄依然叫hEdit,那是因为我先前的判断失误。

“QQ反骚扰”v1.SVOF.12的核心代码就讲到这里了,不过还有一点,就是我的“QQ反骚扰”中存在着一个不大不小的Bug。大家注意到了吗?第三段代码中,如果碰到标题是10000的静态文本,就向“返回”按钮发送单击消息。这也就意味着如果一个昵称是10000的网友加你为好友,那么他的这条系统信息同样有可能被过滤掉。解决的办法是判断“加为好友”按钮的风格是否为可见(WS_VISIBLE),若为不可见,则可以向“返回”按钮发送单击消息了。但是由于我个人时间的问题,这段代码还没有来得及实现,就交给大家了,呵呵。 


后记:和“反骚扰”说再见

“QQ反骚扰”是我的VC SDK处女作,我从去年10月份开始写这个软件,之后又经历了很多次升级,到这个“最终版本”——v1.37为止,我终于决定停手了。

原因很简单,QQ的版本不断升级,广告的花样也越来越多,这就决定了我不得不一次次地升级这个软件。而现在网上关于“反骚扰”的技巧又有很多,所以我觉得我这么做就有点多此一举了。既然我的目的——学习——达到了,那么再“升级”下去也就失去意义了。

我仍然感谢很多网友,感谢他们对我的信任和对我的关心。我无以回报,决定将这个处女作的源代码倾囊相授,而不再是“核心代码演示版”。是前我的代码是用C++写成的,主要包括了我封装的CheckBox类,现在看来那个类十分丑陋,唯恐给诸位带来误导的副作用,于是我花了一些时间,将它用纯C重写了一遍,希望能够满足和我一样的初学者的需要。顺便说一句,这个v1.37几乎对QQ2003无能为力。还有,Visual Studio中自带的工具Spy++比我的“对话框查看器”功能要强得多。

OK,那么再见了,我的“QQ反骚扰”。





相关文章

最新评论