100行代码去除QQ广告
2008-10-30 22:12
281 查看
原文: http://www.cppblog.com/lovelypig/archive/2008/10/26/65130.html
为什么写这个:
1,像我这么爱干净的人,当然不能容忍和MM聊天的时候,看到一个内衣广告在上面一闪一闪,这不引诱老纳么;
2,为什么不用其它外挂?珊瑚虫已S,再没用过其它。现有的外挂实现了一些我不想要的功能,看IP也没必要,聊天的都是熟人。另外,不知道它做了些什么事情;
3,打发这个无聊的周末。
怎样实现:
1,万能的HOOK
现在用到的是全局的SHELL HOOK,Hook的是窗口创建完成的消息;
g_hShellHook = SetWindowsHookEx( WH_SHELL,
(HOOKPROC)ShellHook,
g_hInstance,
0);
ShellHook 的实现如下:
static LRESULT CALLBACK ShellHook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
goto CallOrg;
if( HSHELL_WINDOWCREATED == nCode )
{
if( !isQQWnd( (HWND)wParam ) )
goto CallOrg;
EnumChildWindows( (HWND)wParam, EnumChildProc, (LPARAM)0 );
}
CallOrg:
return CallNextHookEx( g_hShellHook, nCode, wParam, lParam);
}
在收到窗口创建后的消息时,就判断这个窗口是不是QQ的,这里用到了 GetWindowThreadProcessId ,它返回窗口相关的进程ID
BOOL isQQWnd(HWND hWnd)
{
if( g_pContext == NULL )
return FALSE;
if( g_dwQQProcessID == 0 )
g_dwQQProcessID = GetQQProcessID();
DWORD dwWndProcessID;
if( GetWindowThreadProcessId( hWnd, &dwWndProcessID ) == 0 )
return FALSE;
return dwWndProcessID == g_dwQQProcessID;
}
然后枚举它的子窗口,看它的子窗口有没有广告控件,有的话就给子控件发送个WM_CLOSE的消息.
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam )
{
DWORD dwID = GetDlgCtrlID( hwnd );
if( dwID == 0x3e9 )
{
HWND hPrarent = GetParent( hwnd );
PostMessage(hwnd, WM_CLOSE, 0, 0 );
Sleep( 10 );
PostMessage(hPrarent, WM_PAINT, 0, 0 );
}
else if( dwID == 0x643f )
{
PostMessage(hwnd, WM_CLOSE, 0, 0 );
}
return TRUE;
}
其中的两个硬编码是用 spy++ 分析出来的,可能因为版本的不同,会有差异。所以我不确定能不能关闭其它版本的QQ广告。我使用的版本是QQ2008贺岁版。
--------------------------------------------------------------------------
后记:
尽管实现的技术很简单,但还是花了我大半天的时间. 写完之后觉得枚举子窗口的方式太低效, 或者还有其它高效点的方式。另外还有全局钩子,可能没有必要。如果下午周末持续无聊,我会尝试改进一下。
QQ的聊天对话框很简单,不像MSN的对话框,铁板一块,用spy++啥都看不到.但是可以用 AccExplorer 分析.想在MSN的对话框上加点东西进去,实现起来很困难。对这方面有研究的同学不妨与我讨论一下实现,一起学习、进步。
代码的行数没数,有效代码估计也就百把行吧,呵呵,我承认我是标题党。
附: 源代码 + bin
100行代码去除QQ广告
为什么写这个: 1,像我这么爱干净的人,当然不能容忍和MM聊天的时候,看到一个内衣广告在上面一闪一闪,这不引诱老纳么;
2,为什么不用其它外挂?珊瑚虫已S,再没用过其它。现有的外挂实现了一些我不想要的功能,看IP也没必要,聊天的都是熟人。另外,不知道它做了些什么事情;
3,打发这个无聊的周末。
怎样实现:
1,万能的HOOK
现在用到的是全局的SHELL HOOK,Hook的是窗口创建完成的消息;
g_hShellHook = SetWindowsHookEx( WH_SHELL,
(HOOKPROC)ShellHook,
g_hInstance,
0);
ShellHook 的实现如下:
static LRESULT CALLBACK ShellHook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
goto CallOrg;
if( HSHELL_WINDOWCREATED == nCode )
{
if( !isQQWnd( (HWND)wParam ) )
goto CallOrg;
EnumChildWindows( (HWND)wParam, EnumChildProc, (LPARAM)0 );
}
CallOrg:
return CallNextHookEx( g_hShellHook, nCode, wParam, lParam);
}
在收到窗口创建后的消息时,就判断这个窗口是不是QQ的,这里用到了 GetWindowThreadProcessId ,它返回窗口相关的进程ID
BOOL isQQWnd(HWND hWnd)
{
if( g_pContext == NULL )
return FALSE;
if( g_dwQQProcessID == 0 )
g_dwQQProcessID = GetQQProcessID();
DWORD dwWndProcessID;
if( GetWindowThreadProcessId( hWnd, &dwWndProcessID ) == 0 )
return FALSE;
return dwWndProcessID == g_dwQQProcessID;
}
然后枚举它的子窗口,看它的子窗口有没有广告控件,有的话就给子控件发送个WM_CLOSE的消息.
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam )
{
DWORD dwID = GetDlgCtrlID( hwnd );
if( dwID == 0x3e9 )
{
HWND hPrarent = GetParent( hwnd );
PostMessage(hwnd, WM_CLOSE, 0, 0 );
Sleep( 10 );
PostMessage(hPrarent, WM_PAINT, 0, 0 );
}
else if( dwID == 0x643f )
{
PostMessage(hwnd, WM_CLOSE, 0, 0 );
}
return TRUE;
}
其中的两个硬编码是用 spy++ 分析出来的,可能因为版本的不同,会有差异。所以我不确定能不能关闭其它版本的QQ广告。我使用的版本是QQ2008贺岁版。
--------------------------------------------------------------------------
后记:
尽管实现的技术很简单,但还是花了我大半天的时间. 写完之后觉得枚举子窗口的方式太低效, 或者还有其它高效点的方式。另外还有全局钩子,可能没有必要。如果下午周末持续无聊,我会尝试改进一下。
QQ的聊天对话框很简单,不像MSN的对话框,铁板一块,用spy++啥都看不到.但是可以用 AccExplorer 分析.想在MSN的对话框上加点东西进去,实现起来很困难。对这方面有研究的同学不妨与我讨论一下实现,一起学习、进步。
代码的行数没数,有效代码估计也就百把行吧,呵呵,我承认我是标题党。
附: 源代码 + bin
相关文章推荐
- 限制游客只能访问帖子部分内容+广告代码+用QQ登陆FOR X2正式版
- 手动去除QQ 2007烦人的广告 ZT
- QQ去除广告批处理
- Windows Vista下去除QQ和MSN广告的方法
- javascript 仿QQ/MSN右下角广告代码
- 去除主机屋强制插入WordPress广告代码的解决办法
- 去除QQ广告和去除MSN广告
- 如何去除QQ广告?
- javascript 仿QQ/MSN右下角广告代码
- 教你如何去除电脑QQ聊天窗口上的广告?
- 如何去除QQ广告?
- 去除QQ聊天窗口底部广告
- 马克斯程序播放器广告代码的去除方法
- QQ在线咨询漂浮广告代码
- win8下去除QQ聊天窗口的广告
- 邱邱小助手V1.0绿色版【去除QQ广告和新闻弹窗】
- 去除QQ迷你首页和广告
- 两句代码去somee广告 ----谈怎样去除免费空间的广告
- 酷狗去广告一键去除批处理代码
- QQ去除聊天框广告详解——2016.9 版