奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> Delphi >> Delphi中利用钩子实现QQ聊天窗口的修改
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • Delphi实现网页表单数

  • 用Delphi开发Web服务数

  • 一个判断定文件是否为

  • 把Flash文件转换为Exe

  • 用Delphi实现文件下载

  • Delphi中保存图像列表

  • 基于Delphi的接口编程

  • 在Delphi中使用Create

  • Delphi中利用钩子实现QQ聊天窗口的修改
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-22

      有人曾为公司不让用QQ、MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了。

      当初公司做校园一卡通的项目时,里面的机房客户端需要用到系统的低级键盘钩子WH_KEYBOARD_LL,这也是我第一次接触到Windows中的Hook,因为WH_KEYBOARD_LL和其他钩子不一样,在Delphi的Windows帮助以及windows.pas文件中都没有定义,但microsoft的msdn中确有WH_KEYBOARD_LL的介绍,所以一路解决后就对Windows的系统钩子产生了兴趣。之后相继做过鼠标钩子WH_MOUSE、低级鼠标钩子WH_MOUSE_LL以及消息钩子WH_GETMESSAGE的小例子,都很有意思。

      这次我用到的是另外一个系统钩子:WH_CBT。

      看了delphi中的帮助,发现CBTProc中有很多功能:

    HCBT_ACTIVATE
    HCBT_CREATEWND
    HCBT_DESTROYWND
    HCBT_MINMAX
    HCBT_MOVESIZE
    HCBT_SETFOCUS
    HCBT_SYSCOMMAND

      (具体就不介绍了,看看帮助里写的很清楚)

      随后便开始试验起来,最终完成了这个小程序。下面我简单介绍一下:

      运行程序后自动隐藏,当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口呢?(更换图标的方法也很多,可以用程序,也可以用软件直接修改QQ的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,呵呵)。

      下面将代码帖出:

    library HookPrj;

    uses
     SysUtils,
     Classes,
     QQTitleHook in ’QQTitleHook.pas’;

     exports
    EnableWheelHook, DisableWheelHook;

    begin
     hkQQChat:= 0;
    end.
    ==========================================================
    unit QQTitleHook;

    interface

    uses
     Windows, Messages, SysUtils, Dialogs, CommCtrl, StrUtils;

    var
     hkQQChat: HHOOK;
     //聊天窗口的句柄
     hwQQChat: HWnd ;
     //聊天窗口的标题
     tlQQChat: string;
     //窗口类名
     clsName: string;
     buf: array [0..1024] of char;

     const
      //QQ聊天窗口的类名
      csQQ = ’#32770’;

     function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
     function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;
     function EnableWheelHook : Boolean; stdcall; export;
     function DisableWheelHook: Boolean; stdcall; export;

     implementation
     
     //钩子的处理函数
     function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
     begin
      Result:= 0;
      if Code<0 then
      begin
       Result:= CallNextHookEx(hkQQChat, Code, wParam, lParam);
       Exit;
      end
      else
       if Code = HCBT_ACTIVATE then
       begin
        //获取激活窗口的句柄,以及窗口类名,然后判断此窗口类名是否为#32770。
        hwQQChat:= HWND(wParam);
        GetClassName(hwQQChat, buf, 1024);
        clsName:= string(buf);
        if clsName = csQQ then
        begin
         //如果窗口类名是#32770,则遍枚举所有窗口,并将窗口句柄传入
         //【这里仅仅做演示用,因为Windows中很多窗口的类名均为#32770,所以这样判断效率会很底,】
         //【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件,从而提高效率。】
         EnumWindows(@EnumWindowsTitleFunc, hwQQChat);
        end;
       end;
      end;

     function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;
     begin
      if (Handle = lParam) and boolean(GetWindowText(Handle, buf, 256)) then
      begin
       //根据窗口句柄获得窗口标题
       tlQQChat:= string(buf);
       //然后判断标题中是否包含“与...聊天”等相关字符,如果包括则此窗口为QQ聊天窗口
       if ((pos(’与’, tlQQChat)>0) and (pos(’聊天中’, tlQQChat)>0)) then
       begin
        //确定为聊天窗口后遍修改窗口标题。
        tlQQChat := AnsiReplaceStr(tlQQChat, ’与’ , ’我的文档’);
        tlQQChat := AnsiReplaceStr(tlQQChat, ’聊天中’, ’’ );
        SetWindowText(Handle, pchar(tlQQChat));
       end;
       //【同上,这个地方大家可以自由控制,不仅仅局限在QQ、MSN等聊天窗口。】
       //【而且想要将标题改成什么也可以自由控制,如果能根据修改后的窗口图标来确定标题】
       //【比如通过修改将窗口图标替换成Delphi的图标,然后标题修改为Delphi7,谁还能看出破绽呢?哈哈】
       if ((pos(’群 -’, tlQQChat)>0) or (pos(’高级群 -’, tlQQChat)>0)) then
       begin
        tlQQChat := AnsiReplaceStr(tlQQChat, ’群 -’, ’我的文档’);
        tlQQChat := AnsiReplaceStr(tlQQChat, ’高级’ , ’’ );
        SetWindowText(Handle, pchar(tlQQChat));
       end;
       //MSN
       if pos(’ - 对话’, tlQQChat)>0 then
       begin
        tlQQChat := AnsiReplaceStr(tlQQChat, ’ - 对话’ , ’我的文档’);
        SetWindowText(Handle, pchar(tlQQChat));
       end;
      end;
      Result :=True;
     end;

     //启动钩子
     function EnableWheelHook: Boolean; stdcall; export;
     begin
      if hkQQChat=0 then
      begin
       hkQQChat := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
       Result := True;
      end
      else
       Result := False;
      end;

      //卸载钩子
      function DisableWheelHook: Boolean; stdcall; export;
      begin
       if hkQQChat<>0 then
       begin
        UnHookWindowsHookEx(hkQQChat);
        hkQQChat := 0;
        Result := True;
       end
       else
        Result := False;
       end;

      end.
    ====================================

      调用的应用程序就很简单了,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。

      程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。 

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.