Delphi編程實現(xiàn)QQ聊天窗口的修改
有人曾為公司不讓用QQ、MSN等聊天工具而煩惱嗎?看了下面的小程序你就會打消這種看法了。本文將教你在Delphi中編程實現(xiàn)QQ聊天窗口的修改。具體方法如下:
這次我用到的是一個系統(tǒng)鉤子: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的消息時會驚奇的發(fā)現(xiàn)聊天窗口的那個討厭的“與XX聊天”的標題沒有了,而標題換成了“我的文檔”。這時如果你再將此聊天窗口的圖標換成文檔樣式的圖標,那么誰還能看出那就是你的聊天窗口。調用應用程序很簡單,調用EnableWheelHook后隱藏就可以了,退出時DisableWheelHook就OK啦。
程序僅僅提供大家一個思路,還有很多不完善的地方,希望有興趣的朋友聯(lián)系我,共同交流提高。
【編輯推薦】