问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2023-04-22 04:46

我来回答

1个回答

热心网友 时间:2023-10-17 20:26

  你曾为公司不让用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_SYSMAND

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

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

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

  下面将代码帖出

library HookPrj;

uses SysUtils  Classes  QQTitleHook in QQTitleHook pas ;

 exportsEnableWheelHook DisableWheelHook;

begin QQChat:= ;end unit QQTitleHook;

interface

uses Windows Messages SysUtils Dialogs CommCtrl StrUtils;

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

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

 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:= ;  if Code< then  begin   Result:= CallNextHookEx(QQChat Code wParam lParam);   Exit;  end  else   if Code = HCBT_ACTIVATE then   begin    //获取激活窗口的句柄 以及窗口类名 然后判断此窗口类名是否为#     hwQQChat:= HWND(wParam);    GetClassName(hwQQChat buf );    clsName:= string(buf);    if clsName = csQQ then    begin  //如果窗口类名是# 则遍枚举所有窗口 并将窗口句柄传入//【这里仅仅做演示用 因为Windows中很多窗口的类名均为# 所以这样判断效率会很低】//【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件 从而提高效率 】     EnumWindows(@EnumWindowsTitleFunc hwQQChat);    end;   end;  end;

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

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

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

  end

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

lishixin/Article/program/Delphi/201311/24742
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
分手后说过的话精选185句 分手说的精选113句 分手怎么挽回女朋友的句子精选162句 现在工作忙的要死,女朋友因为这跟我分手,我该怎么办? ...任意组成两个不同的两位小数,并把它们改写成以0.001为计数单位... m3/MW▪h怎么换算m3/s▪GW? 交通银行的刷卡金怎么使用呢? 什么时候刷卡金 ...突然前面两条腿好像断了一样 走路前面两腿都无法支撑 吃饭就坐着吃... 王者荣耀:伤害与回复兼备的杨戬,为何不受待见,真废了吗? 劳务合同可以随便签吗 工人可以签劳务合同吗 有一部动画片是原始人的叫什么? 5个人类驾驶机甲武装恐龙动画片名字 公子的读音公子的读音是什么 公子的结构公子的结构是什么 公子的拼音狐公子的拼音是什么 公子的成语公子的成语是什么 公子的近义词公子的近义词是什么 公子的引证解释公子的引证解释是什么 公子的诗词公子的诗词是什么 竭诚的解释竭诚的解释是什么 彩钢岩棉板房顶能晒东西吗吗 四字成语什么官许愿 幼儿园大班室内亲子游戏大全 &#xFEFF;封官许愿什么意思?有什么典故? PSP有NDS的模拟器吗? psp可不可以玩NDS的游戏呀?如果可以,怎样设置? 口_的词语口_的词语是什么 韶亮的读音韶亮的读音是什么 梦见粘住很多小黑鼠的预兆 梦见一堆老鼠还粘了一只的预兆 梦见一群黑鼠在家的预兆 梦见几只老鼠的预兆 人生什么梦的成语 tf璀璨鎏金唇膏和金箔区别 宝可梦ptcg现在是多少弹 退抑的拼音狐退抑的拼音是什么 冲挹的拼音狐冲挹的拼音是什么 流谦的拼音狐流谦的拼音是什么 张籍《和裴仆射看樱桃花》原文及翻译赏析 _轵的结构_轵的结构是什么 轵深井的结构轵深井的结构是什么 辛弃疾《浣溪沙(种梅菊)》原文及翻译赏析 你想要一个东西 (签名+藏头诗)艾家林 自有渊明方有菊的哲学思想 意象世界显现真实是指照亮天人合一的本然状态 数据库课程学习的主要内容?举例说明 数据库课程学习内容具体介绍 肥家的诗句肥家的诗句是什么 虎头的读音虎头的读音是什么