有人曾为公司不让用QQ、MSN等聊天工具而烦恼吗?看了下面的小程序你就会打消这种看法了。本文将教你在Delphi中编程实现QQ聊天窗口的修改。具体方法如下:
这次我用到的是一个系统钩子:WH_CBT。
编写代码如下:
- 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.
调试:运行程序后自动隐藏,当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口。调用应用程序很简单,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。
程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。
【编辑推荐】