Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496963
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:51:02

下载本文示例代码
  有人曾为公司不让用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_ACTIVATEHCBT_CREATEWNDHCBT_DESTROYWNDHCBT_MINMAXHCBT_MOVESIZEHCBT_SETFOCUSHCBT_SYSCOMMAND  (具体就不介绍了,看看帮助里写的很清楚)  随后便开始试验起来,最终完成了这个小程序。下面我简单介绍一下:  运行程序后自动隐藏,当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口呢?(更换图标的方法也很多,可以用程序,也可以用软件直接修改QQ的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,呵呵)。  下面将代码帖出: library HookPrj;uses SysUtils, Classes, QQTitleHook in ’QQTitleHook.pas’; exportsEnableWheelHook, DisableWheelHook;begin hkQQChat:= 0;end.==========================================================unit QQTitleHook;interfaceuses 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.====================================  调用的应用程序就很简单了,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。  程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。   有人曾为公司不让用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_ACTIVATEHCBT_CREATEWNDHCBT_DESTROYWNDHCBT_MINMAXHCBT_MOVESIZEHCBT_SETFOCUSHCBT_SYSCOMMAND  (具体就不介绍了,看看帮助里写的很清楚)  随后便开始试验起来,最终完成了这个小程序。下面我简单介绍一下:  运行程序后自动隐藏,当你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口呢?(更换图标的方法也很多,可以用程序,也可以用软件直接修改QQ的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,呵呵)。  下面将代码帖出: library HookPrj;uses SysUtils, Classes, QQTitleHook in ’QQTitleHook.pas’; exportsEnableWheelHook, DisableWheelHook;begin hkQQChat:= 0;end.==========================================================unit QQTitleHook;interfaceuses 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.====================================  调用的应用程序就很简单了,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。  程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。 下载本文示例代码


Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改Delphi中利用钩子实现QQ聊天窗口的修改
阅读(116) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~