• 注册
  • 关于作者
    企业认证:趣记站长
    关注 6 粉丝 4 喜欢 9 内容 992
    江西省·南昌市
    聊天 送礼
    • 查看作者
    • Delphi中利用钩子实现QQ聊天窗口的修改

        有人曾为公司不让用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的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,

      Delphi编程禁止用户关闭操作系统
      基于Delphi的屏幕抓图技术的实现,Delphi中数据的自动录入,Delphi编程:用流来读取TXT文件中的数据,使用Delphi创建IIS虚拟目录的方法,Delphi初学者应小心的六大陷阱,Delphi“判断服务器路径”与“清空日志文件”,利用VFW在Delphi中开发视频捕获程序,Delphi实现网页表单数据的自动提交,Delphi编程使用HOOK监视Windows,Delphi编程禁止用户关闭操作系统,Delphi中利用钩子实现QQ聊天窗口的修改,一个判断定文件是否为文本文件的函数,把Flash文件转换为Exe文件,用Delphi实现文件下载的几种方法,Delphi中保存图像列表,基于Delphi的接口编程入门,在Delphi中使用CreateOleObject方法对WORD文件进行操作,利用Delphi开发旅游景点微机售票系统,Delphi中用ICMP探测远程主机状态,Delphi7对XML的支持分析
      Delphi

      呵呵)。

        下面将代码帖出:

      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啦。

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

      Delphi编程使用HOOK监视Windows
      基于Delphi的屏幕抓图技术的实现,Delphi中数据的自动录入,Delphi编程:用流来读取TXT文件中的数据,使用Delphi创建IIS虚拟目录的方法,Delphi初学者应小心的六大陷阱,Delphi“判断服务器路径”与“清空日志文件”,利用VFW在Delphi中开发视频捕获程序,Delphi实现网页表单数据的自动提交,Delphi编程使用HOOK监视Windows,Delphi编程禁止用户关闭操作系统,Delphi中利用钩子实现QQ聊天窗口的修改,一个判断定文件是否为文本文件的函数,把Flash文件转换为Exe文件,用Delphi实现文件下载的几种方法,Delphi中保存图像列表,基于Delphi的接口编程入门,在Delphi中使用CreateOleObject方法对WORD文件进行操作,利用Delphi开发旅游景点微机售票系统,Delphi中用ICMP探测远程主机状态,Delphi7对XML的支持分析
      Delphi

    • 0
    • 0
    • 0
    • 112
    • 单栏布局 侧栏位置: