发布网友 发布时间: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