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的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,呵呵)。

  下面将代码帖出:

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

  程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi实现QQ自动聊天功能,用法介绍: 打开QQ聊天室, 可以一号开多个聊天室,也可以多号进一个聊天室.然后点自动检测,然后用打开文本选择你要发送的信息当然也可以直接写信息在文本窗口内,最后点开始发送,默认时间   为30秒发送一次.可以根据需要自己调整。详细用发介绍:   工具条按钮介绍:    进程窗口按钮    点击后显示进程窗口。    文本窗口按钮    点击后显示要发送的文本。    打开按钮    点击后显示进程窗口。    打开文本按钮    点击后选择要打开的文本文件。    开始/停止发送按钮    开始或暂停发送消息。    内容重复按钮    一次总循环中发送内容相同。总循环一次文本换一行。    内容递增按钮    进程跳转一次文本内容换一行。    删除进程按钮    删除列表中选中的进程。    自动检测按钮    自动检测当前QQ聊天室里的输入框进程。   时间行号控制板说明    总循环时间    默认为30秒用户可以在1-1000秒内定义。    间隔发送时间    用户不可以定义,随总循环时间和进程多少而计算。    间隔发送时间=总循环时间÷列表中进程数量。    行号显示与指定行号按钮    行号显示“第?行”为当前进程正在发送的文本行。    指定行号按钮与行号显示紧挨在一起,点击后将使当前发送位置跳转到文本窗口里光标所在行,这个    功能使用户自己选择从哪一行开始发送。    定义进程请用F12说明    手动进程定义,将鼠标移动到你要自动发送消息的聊天室输入框(输入框不需要得到焦点)然后按F12,转回QQ聊神的进程窗口可以就可以看到你定义的进程了.用这种方法可以给线上好友自动发消息,但是需要把   聊天模式改为按回车发送信息.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值