Delphi中利用钩子实现QQ聊天窗口的修改

来源:互联网 发布:下载戏曲的软件 编辑:程序博客网 时间:2024/05/16 08:11

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

(具体就不介绍了,看看帮助里写的很清楚)

随后便开始试验起来,最终完成了这个小程序。下面我简单介绍一下:

运行程序后自动隐藏,当seo首推精图数码你提取QQ或者MSN的消息时会惊奇的发现聊天窗口的那个讨厌的“与XX聊天”的标题没有了,而标题换成了“我的文档”。这时如果你再将此聊天窗口的图标换成文档样式的图标,那么谁还能看出那就是你的聊天窗口呢?(更换图标的方法也很多,可以用程序,也可以用软件直接修改QQ的资源文件,这部分我没有做,这里只是提供大家一个思路,有兴趣的朋友可以自己尝试一下,呵呵)。

下面将代码帖出:

 

  1. library HookPrj;
  2.  
  3. uses
  4. SysUtils,
  5. Classes,
  6. QQTitleHook in QQTitleHook.pas’;
  7.  
  8. exports
  9. EnableWheelHook, DisableWheelHook;
  10.  
  11. begin
  12. hkQQChat:= 0;
  13. end.
  14. ==========================================================
  15. unit QQTitleHook;
  16.  
  17. interface
  18.  
  19. uses
  20. Windows, Messages, SysUtils, Dialogs, CommCtrl, StrUtils;
  21.  
  22. var
  23. hkQQChat: HHOOK;
  24. //聊天窗口的句柄
  25. hwQQChat: HWnd ;
  26. //聊天窗口的标题
  27. tlQQChat: string;
  28. //窗口类名
  29. clsName: string;
  30. buf: array [0..1024] of char;
  31.  
  32. const
  33. //QQ聊天窗口的类名
  34. csQQ = #32770’;
  35.  
  36. function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  37. function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;
  38. function EnableWheelHook : Boolean; stdcall; export;
  39. function DisableWheelHook: Boolean; stdcall; export;
  40.  
  41. implementation
  42. //钩子的处理函数
  43. function TitleHookProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  44. begin
  45. Result:= 0;
  46. if Code<0 then
  47. begin
  48. Result:= CallNextHookEx(hkQQChat, Code, wParam, lParam);
  49. Exit;
  50. end
  51. else
  52. if Code = HCBT_ACTIVATE then
  53. begin
  54. //获取激活窗口的句柄,以及窗口类名,然后判断此窗口类名是否为#32770。
  55. hwQQChat:= HWND(wParam);
  56. GetClassName(hwQQChat, buf, 1024);
  57. clsName:= string(buf);
  58. if clsName = csQQ then
  59. begin
  60. //如果窗口类名是#32770,则遍枚举所有窗口,并将窗口句柄传入
  61. //【这里仅仅做演示用,因为Windows中很多窗口的类名均为#32770,所以这样判断效率会很底,】
  62. //【有兴趣的朋友可以根据QQ聊天窗口的特性来增加判断条件,从而提高效率。】
  63. EnumWindows(@EnumWindowsTitleFunc, hwQQChat);
  64. end;
  65. end;
  66. end;
  67.  
  68. function EnumWindowsTitleFunc(Handle: THandle; lParam: LPARAM): boolean ; stdcall;
  69. begin
  70. if (Handle = lParam) and boolean(GetWindowText(Handle, buf, 256)) then
  71. begin
  72. //根据窗口句柄获得窗口标题
  73. tlQQChat:= string(buf);
  74. //然后判断标题中是否包含“与...聊天”等相关字符,如果包括则此窗口为QQ聊天窗口
  75. if ((pos(’与’, tlQQChat)>0) and (pos(’聊天中’, tlQQChat)>0)) then
  76. begin
  77. //确定为聊天窗口后遍修改窗口标题。
  78. tlQQChat := AnsiReplaceStr(tlQQChat, ’与’ , ’我的文档’);
  79. tlQQChat := AnsiReplaceStr(tlQQChat, ’聊天中’, ’’ );
  80. SetWindowText(Handle, pchar(tlQQChat));
  81. end;
  82. //【同上,这个地方大家可以自由控制,不仅仅局限在QQ、MSN等聊天窗口。】
  83. //【而且想要将标题改成什么也可以自由控制,如果能根据修改后的窗口图标来确定标题】
  84. //【比如通过修改将窗口图标替换成Delphi的图标,然后标题修改为Delphi7,谁还能看出破绽呢?哈哈】
  85. if ((pos(’群 -’, tlQQChat)>0) or (pos(’高级群 -’, tlQQChat)>0)) then
  86. begin
  87. tlQQChat := AnsiReplaceStr(tlQQChat, ’群 -’, ’我的文档’);
  88. tlQQChat := AnsiReplaceStr(tlQQChat, ’高级’ , ’’ );
  89. SetWindowText(Handle, pchar(tlQQChat));
  90. end;
  91. //MSN
  92. if pos(’ - 对话’, tlQQChat)>0 then
  93. begin
  94. tlQQChat := AnsiReplaceStr(tlQQChat, - 对话’ , ’我的文档’);
  95. SetWindowText(Handle, pchar(tlQQChat));
  96. end;
  97. end;
  98. Result :=True;
  99. end;
  100.  
  101. //启动钩子
  102. function EnableWheelHook: Boolean; stdcall; export;
  103. begin
  104. if hkQQChat=0 then
  105. begin
  106. hkQQChat := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
  107. Result := True;
  108. end
  109. else
  110. Result := False;
  111. end;
  112.  
  113. //卸载钩子
  114. function DisableWheelHook: Boolean; stdcall; export;
  115. begin
  116. if hkQQChat<>0 then
  117. begin
  118. UnHookWindowsHookEx(hkQQChat);
  119. hkQQChat := 0;
  120. Result := True;
  121. end
  122. else
  123. Result := False;
  124. end;
  125.  
  126. end.
  127. ====================================


调用的应用程序就很简单了,调用EnableWheelHook后隐藏就可以了,退出时DisableWheelHook就OK啦。

程序仅仅提供大家一个思路,还有很多不完善的地方,希望有兴趣的朋友联系我,共同交流提高。

0 0
原创粉丝点击