Delphi编程实现QQ聊天窗口的修改

开发 开发工具
本文是笔者在Delphi学习过程中,得出的个人体会,介绍了Delphi编程实现QQ聊天窗口的修改的具体方法,希望能与大家共同分享一下。

  有人曾为公司不让用QQ、MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了。本文将教你在Delphi中编程实现QQ聊天窗口的修改。具体方法如下:

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

  编写代码如下:

  1. library HookPrj;  
  2.  
  3. uses  
  4.  SysUtils,  
  5.  Classes,  
  6.  QQTitleHook in ’QQTitleHook.pas’;  
  7.  
  8.  exports  
  9. EnableWheelHook, DisableWheelHook;  
  10.  
  11. begin  
  12.  hkQQChat:= 0;  
  13. end.  
  14.  
  15.  
  16. unit QQTitleHook;  
  17.  
  18. interface 
  19.  
  20. uses  
  21.  Windows, Messages, SysUtils, Dialogs, CommCtrl, StrUtils;  
  22.  
  23. var  
  24.  hkQQChat: HHOOK;  
  25.  //聊天窗口的句柄  
  26.  hwQQChat: HWnd ;  
  27.  //聊天窗口的标题  
  28.  tlQQChat: string;  
  29.  //窗口类名  
  30.  clsName: string;  
  31.  buf: array [0..1024] of char;  
  32.  
  33.  const 
  34.   //QQ聊天窗口的类名  
  35.   csQQ = ’#32770’;  
  36.  
  37.  function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;  
  38.  function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;  
  39.  function EnableWheelHook : Boolean; stdcall; export;  
  40.  function DisableWheelHook: Boolean; stdcall; export;  
  41.  
  42.  implementation  
  43.    
  44.  //钩子的处理函数  
  45.  function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;  
  46.  begin  
  47.   Result:= 0;  
  48.   if Code<0 then  
  49.   begin  
  50.    Result:= CallNextHookEx(hkQQChat, Code, wParam, lParam);  
  51.    Exit;  
  52.   end  
  53.   else 
  54.    if Code = HCBT_ACTIVATE then  
  55.    begin  
  56.     //获取激活窗口的句柄,以及窗口类名,然后判断此窗口类名是否为#32770。  
  57.     hwQQChat:= HWND(wParam);  
  58.     GetClassName(hwQQChat, buf, 1024);  
  59.     clsName:= string(buf);  
  60.     if clsName = csQQ then  
  61.     begin  
  62.      //如果窗口类名是#32770,则遍枚举所有窗口,并将窗口句柄传入  
  63.      //【这里仅仅做演示用,因为Windows中很多窗口的类名均为#32770,所以这样判断效率会很底,】  
  64.      //【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件,从而提高效率。】  
  65.      EnumWindows(@EnumWindowsTitleFunc, hwQQChat);  
  66.     end;  
  67.    end;  
  68.   end;  
  69.  
  70.  function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;  
  71.  begin  
  72.   if (Handle = lParam) and boolean(GetWindowText(Handle, buf, 256)) then  
  73.   begin  
  74.    //根据窗口句柄获得窗口标题  
  75.    tlQQChat:= string(buf);  
  76.    //然后判断标题中是否包含“与...聊天”等相关字符,如果包括则此窗口为QQ聊天窗口  
  77.    if ((pos(’与’, tlQQChat)>0) and (pos(’聊天中’, tlQQChat)>0)) then  
  78.    begin  
  79.     //确定为聊天窗口后遍修改窗口标题。  
  80.     tlQQChat := AnsiReplaceStr(tlQQChat, ’与’ , ’我的文档’);  
  81.     tlQQChat := AnsiReplaceStr(tlQQChat, ’聊天中’, ’’ );  
  82.     SetWindowText(Handle, pchar(tlQQChat));  
  83.    end;  
  84.    //【同上,这个地方大家可以自由控制,不仅仅局限在QQ、MSN等聊天窗口。】  
  85.    //【而且想要将标题改成什么也可以自由控制,如果能根据修改后的窗口图标来确定标题】  
  86.    //【比如通过修改将窗口图标替换成Delphi的图标,然后标题修改为Delphi7,谁还能看出破绽呢?】  
  87.    if ((pos(’群 -’, tlQQChat)>0) or (pos(’高级群 -’, tlQQChat)>0)) then  
  88.    begin  
  89.     tlQQChat := AnsiReplaceStr(tlQQChat, ’群 -’, ’我的文档’);  
  90.     tlQQChat := AnsiReplaceStr(tlQQChat, ’高级’ , ’’ );  
  91.     SetWindowText(Handle, pchar(tlQQChat));  
  92.    end;  
  93.    //MSN  
  94.    if pos(’ - 对话’, tlQQChat)>0 then  
  95.    begin  
  96.     tlQQChat := AnsiReplaceStr(tlQQChat, ’ - 对话’ , ’我的文档’);  
  97.     SetWindowText(Handle, pchar(tlQQChat));  
  98.    end;  
  99.   end;  
  100.   Result :=True;  
  101.  end;  
  102.  
  103.  //启动钩子  
  104.  function EnableWheelHook: Boolean; stdcall; export;  
  105.  begin  
  106.   if hkQQChat=0 then  
  107.   begin  
  108.    hkQQChat := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);  
  109.    Result := True;  
  110.   end  
  111.   else 
  112.    Result := False;  
  113.   end;  
  114.  
  115.   //卸载钩子  
  116.   function DisableWheelHook: Boolean; stdcall; export;  
  117.   begin  
  118.    if hkQQChat<>0 then  
  119.    begin  
  120.     UnHookWindowsHookEx(hkQQChat);  
  121.     hkQQChat := 0;  
  122.     Result := True;  
  123.    end  
  124.    else 
  125.     Result := False;  
  126.    end;  
  127.  
  128.   end.  

  调试:运行程序后自动隐藏,当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口。调用应用程序很简单,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。

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

【编辑推荐】

  1. 利用VFW在Delphi中开发视频捕获程序
  2. Delphi编程使用HOOK监视Windows
  3. Delphi中如何判断服务器路径
  4. Delphi初学者应小心的六大问题
  5. 基于Delphi的屏幕抓图技术的实现
责任编辑:韩亚珊 来源: 编程爱好者
相关推荐

2011-12-15 10:19:55

JavaNIO

2017-01-09 10:42:56

微信小程序

2021-11-05 13:20:43

微信个人状态移动应用

2021-07-27 12:21:34

微信Bug聊天记录

2014-03-21 09:05:40

2023-08-29 18:23:46

代码AI

2019-11-05 10:00:06

手机QQQQ空间QQ

2012-03-07 14:14:19

win8

2009-08-28 10:24:44

Windows 7系统故障应对QQ窗口自动变大

2009-06-30 16:26:56

2010-08-02 15:21:06

DelphiICMP

2011-04-06 15:51:32

DelphiHOOK

2023-04-21 10:21:26

世优科技ChatGPT数字人

2011-04-06 13:28:46

Delphi

2015-08-06 16:23:04

iosxmpp聊天

2012-05-18 14:53:25

2021-02-23 13:27:28

Android 12谷歌小部件

2011-04-06 13:56:36

Delphi

2009-05-20 14:49:16

ibmdwAjaxWeb开发

2011-03-18 19:05:31

QQQtWidget
点赞
收藏

51CTO技术栈公众号