有人曾为公司不让用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(H