“QQ反骚扰”开发手记

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

>HWND hWndCap, hBtnClose1; // 窗口句柄和“关闭”按钮句柄
hWndCap = FindWindow( NULL, "腾讯QQ系统广播" ); // 查找窗口
if ( hWndCap != NULL ) // 如果窗口存在
{
hBtnClose1 = FindWindowEx( hWndCap, NULL, "Button", "关闭" ); // 继续过滤,找“关闭”按钮
if ( hBtnClose1 != NULL ) // 如果这个按钮也存在,则基本可以确定是QQ的广告了
{
EnableWindow( hBtnClose1, TRUE ); // 将按钮生效
SendMessage( hBtnClose1, BM_CLICK, 0, 0 ); // 发送单击消息
}
}

在此我要说明一下将按钮生效的那行代码。QQ的早期版本中(譬如我目前在家使用的版本),Flash广告是必须得看完一遍后,“关闭”按钮才会生效,所以我必须在找到后立即使它生效以关闭窗口。当然,对于较新版本的QQ来说,完全可以去掉这一行。

对于自动弹出的Flash广告,就没有上面的那个那么容易了。因为它采用的是图形界面,从外表看是得不到我所谓的“过滤器”的,这就需要其它软件的帮助了。我使用的软件是我写的“对话框查看器”测试版v2.SVTF.00,这是一个能够即时获取窗口标题、窗口ID和窗口类名的工具。我在它的帮助下得到了这种广告的“关闭”按钮的标题——“CLOSE”。于是我的代码如下:

HWND hWndNo, hBtnClose2;
hWndNo = FindWindowEx( NULL, NULL, "#32770", "" ); // #32770是对话框的类名
do // 在找到的无标题对话框中反复查找“CLOSE”这个按钮
{
hBtnClose2 = FindWindowEx( hWndNo, NULL, "Button", "CLOSE" );
if ( hBtnClose2 != NULL )
break; // 若找到按钮则跳出循环
hWndNo = FindWindowEx( NULL, hWndNo, "#32770", "" ); // 否则继续查找无标题窗口
} while ( hWndNo != NULL );
if ( hBtnClose2 != NULL )
{
  EnableWindow( hBtnClose2, TRUE ); // 同上,若不需要请将此行自行删除
SendMessage( hBtnClose2, BM_CLICK, 0, 0 );
}

相关文章

最新评论