
当初公司做校园一卡通的项目时 里面的机房客户端需要用到系统的低级键盘钩子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_ACTIVATEHCBT_CREATEWNDHCBT_DESTROYWNDHCBT_MINMAXHCBT_MOVESIZEHCBT_SETFOCUSHCBT_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: IntegerwParam: WPARAMlParam: LPARAM): LRESULTstdcall function EnumWindowsTitleFunc(Handle: THandlelParam: LPARAM): boolean stdcall function EnableWheelHook : Booleanstdcallexport function DisableWheelHook: Booleanstdcallexport
implementation//钩子的处理函数 function TitleHookProc(Code: IntegerwParam: WPARAMlParam: LPARAM): LRESULTstdcall beginResult:= if Code<thenbegin Result:= CallNextHookEx(QQChat Code wParam lParam) Exitendelse if Code = HCBT_ACTIVATE then begin//获取激活窗口的句柄 以及窗口类名 然后判断此窗口类名是否为# hwQQChat:= HWND(wParam)GetClassName(hwQQChat buf )clsName:= string(buf)if clsName = csQQ thenbegin //如果窗口类名是# 则遍枚举所有窗口 并将窗口句柄传入//【这里仅仅做演示用 因为Windows中很多窗口的类名均为# 所以这样判断效率会很低】//【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件 从而提高效率 】 EnumWindows(@EnumWindowsTitleFunc hwQQChat)end endend
function EnumWindowsTitleFunc(Handle: THandlelParam: LPARAM): boolean stdcall beginif (Handle = lParam) and boolean(GetWindowText(Handle buf )) thenbegin //根据窗口句柄获得窗口标题 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 begintlQQChat := AnsiReplaceStr(tlQQChat 群 - 我的文档 )tlQQChat := AnsiReplaceStr(tlQQChat 高级 )SetWindowText(Handle pchar(tlQQChat)) end //MSN if pos( 对话 tlQQChat)>then begintlQQChat := AnsiReplaceStr(tlQQChat 对话 我的文档 )SetWindowText(Handle pchar(tlQQChat)) endendResult :=True end
//启动钩子 function EnableWheelHook: Booleanstdcallexport beginif QQChat= thenbegin QQChat := SetWindowsHookEx(WH_CBT @TitleHookProc Hinstance ) Result := Trueendelse Result := Falseend
//卸载钩子function DisableWheelHook: Booleanstdcallexportbegin if QQChat<>then beginUnHookWindowsHookEx(QQChat)QQChat := Result := True end elseResult := False end
end
调用的应用程序就很简单了 调用EnableWheelHook后隐藏就可以了 退出时DisableWheelHook就OK啦
lishixinzhi/Article/program/Delphi/201311/24742我也是
不知道什么东西
最好就是不用QQ管家
哈哈
但又要加速
郁闷
我查到这些
钩子(Hook),实际上是Windows系统消息处理的一个程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。亦即所谓的“钩子注入”。
QQ电脑管家也正是运用了这一原理来保护您的帐号。
也就是说,QQ电脑管家会随时监控、过滤那些注入的钩子,经过识别后,对认为无害的做放行处理;对可疑的做阻止处理。
QQ电脑管家的帐号关联活动,延期到年末;这也是所有网友期盼的。
QQ电脑管家将日臻完善、优化。正日益受到广大网友的青睐与关注。并且即将发布最新的、完美的版本以飨网友。
QQ电脑管家期待您的使用、体验,并提出宝贵意见。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)