如何利用钩子知道[QQ聊天窗口]弹了出来并得到其句柄?
有三种方法可以弹出[QQ聊天窗口]:
1) 双击面板中某个好友;
2) 有消息来时,双击QQ托盘图标;
3) 有消息来时,快捷键-Ctrl+Alt+Z
我用钩子拦截 WH_CBT 消息,只有起机之后拦截了杀毒软件启动的几个消息,再就其它的应用程序启动或者弹出一些对话框时,什么消息都拦不到了。哪位高人给个好使的例子,谢了。
下面是我的代码,请高人看看哪里出了毛病://█████████████████████████ 处理QQ消息对话框的Title钩子
function TitleHookProc(Code: Integer; WParam: Longint; Msg: Longint): LRESULT; stdcall;
begin
if Code<0 then begin
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
Exit;
end; case Code of
HCBT_ACTIVATE: begin
sLg(lgf, 'ACTIVATE');
end; HCBT_CREATEWND: begin
sLg(lgf, 'CREATEWND'); hQQChatWnd := HWnd(wParam);
GetWindowText(hQQChatWnd, buf, 1024);
QQChatTitle := string(buf);
sLg(lgf, QQChatTitle); //if ( pos('与', QQChatTitle)>0 )and( pos('聊天中', QQChatTitle)>0 ) then begin
// ShowMessage(QQChatTitle);
//end; //if ( pos('NetCaptor', QQChatTitle)>0 ) then begin
// ShowMessage(QQChatTitle);
//end;
end; end;//case Code := -1;
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
end;
……
hkQQChatTitle := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
……
谢谢解答!
有三种方法可以弹出[QQ聊天窗口]:
1) 双击面板中某个好友;
2) 有消息来时,双击QQ托盘图标;
3) 有消息来时,快捷键-Ctrl+Alt+Z
我用钩子拦截 WH_CBT 消息,只有起机之后拦截了杀毒软件启动的几个消息,再就其它的应用程序启动或者弹出一些对话框时,什么消息都拦不到了。哪位高人给个好使的例子,谢了。
下面是我的代码,请高人看看哪里出了毛病://█████████████████████████ 处理QQ消息对话框的Title钩子
function TitleHookProc(Code: Integer; WParam: Longint; Msg: Longint): LRESULT; stdcall;
begin
if Code<0 then begin
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
Exit;
end; case Code of
HCBT_ACTIVATE: begin
sLg(lgf, 'ACTIVATE');
end; HCBT_CREATEWND: begin
sLg(lgf, 'CREATEWND'); hQQChatWnd := HWnd(wParam);
GetWindowText(hQQChatWnd, buf, 1024);
QQChatTitle := string(buf);
sLg(lgf, QQChatTitle); //if ( pos('与', QQChatTitle)>0 )and( pos('聊天中', QQChatTitle)>0 ) then begin
// ShowMessage(QQChatTitle);
//end; //if ( pos('NetCaptor', QQChatTitle)>0 ) then begin
// ShowMessage(QQChatTitle);
//end;
end; end;//case Code := -1;
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
end;
……
hkQQChatTitle := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
……
谢谢解答!
解决方案 »
- listview问题,急!!!
- 麻烦大家给一个建议
- 刚学delphi,一头雾水,她除了能看图片还能干啥啊?
- 请问:如何安装calcomp控件?
- 请问如何编写修改本机ip的程序?
- ActionManager + ActionMainMenuBar怎么用啊?
- adoquery 中 如何实现 select 返回值的问题
- TSocketConnection该怎样用?
- 请教ClientSocket和ServerSocket的问题
- 我急需要知道一个问题,在StringGrid中,某一列中的行的数据太长了。我想分两行来显示。请问该怎么做?
- 如何给注册后的新生分班.......内详!!!!!...如果可以马上给分!!!!!!
- 为什么写入数据库的中文都成了乱码?
unit HKProc;interfaceuses
Windows, Messages,Dialogs,iniFiles,SysUtils;var
hNextHookProc: HHook;
procSaveExit: Pointer;function CBTProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
function EnableHotKeyHook: BOOL; export;
function DisableHotKeyHook: BOOL; export;implementationfunction CBTProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
p: PCBTActivateStruct;
begin
result:= 0;
If iCode<0 Then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end
else
begin
If iCode = HCBT_ACTIVATE then
begin
p:= PCBTActivateStruct(lParam);
if (p.hWndActive = findwindow('#32770',nil)) then showmessage('lkjl');
end;
end;
end;
function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
hNextHookProc := SetWindowsHookEx(WH_CBT,CBTProc,HInstance,0);
Result := hNextHookProc <> 0;
end;function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc);
hNextHookProc := 0;
end;
Result := hNextHookProc = 0;
end;end.
If iCode = HCBT_ACTIVATE then
begin
p:= PCBTActivateStruct(lParam);
p.hWndActive//就是激活窗口的句柄。findwindow('#32770',nil)返回的是QQ聊天窗口的句柄
end;
求解谢谢。
还是不好使啊,后来我也试了类似的方法,并且记入了日志:unit Hook_U; interfaceuses Windows,Messages, SysUtils, dialogs, CommCtrl;var hkLogiWheel, hkQQChatTitle: HHOOK;//钩子的句柄值
hLogiWnd, hQQChatWnd: HWnd;
buf: array [0..1024] of char;
LogiTitle, QQChatTitle, lgf: string;
iC: byte;
zDelta: short;function TitleHookProc(Code: Integer; WParam, Msg: Longint): LRESULT; stdcall;
function EnableWheelHook : Boolean; stdcall; export;
function DisableWheelHook: Boolean; stdcall; export;implementationuses sLg_U;
//█████████████████████████ 处理QQ消息对话框的Title钩子
function TitleHookProc(Code: Integer; WParam, Msg: Longint): LRESULT; stdcall;
begin
if Code<0 then begin
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
Exit;
end; hQQChatWnd := HWnd(wParam);
GetWindowText(hQQChatWnd, buf, 1024);
QQChatTitle := string(buf); case Code of
HCBT_ACTIVATE: begin
sLg(Lgf, format('HCBT_ACTIVATE, %s', [QQChatTitle]));
end; HCBT_CREATEWND: begin
sLg(Lgf, format('HCBT_CREATEWND, %s', [QQChatTitle]));
end; HCBT_DESTROYWND: sLg(Lgf, format('HCBT_DESTROYWND, %s', [QQChatTitle]));
HCBT_KEYSKIPPED: sLg(Lgf, 'HCBT_KEYSKIPPED');
HCBT_MINMAX : sLg(Lgf, 'HCBT_MINMAX');
HCBT_MOVESIZE : sLg(Lgf, 'HCBT_MOVESIZE');
HCBT_QS : sLg(Lgf, 'HCBT_QS');
HCBT_SETFOCUS : sLg(Lgf, format('HCBT_SETFOCUS, %s', [QQChatTitle]));
HCBT_SYSCOMMAND: sLg(Lgf, format('HCBT_SYSCOMMAND, %s', [QQChatTitle]));
else sLg(Lgf, 'else');
end;//case //Code := -1;
Result := CallNextHookEx(hkQQChatTitle, Code, WParam, Longint(@Msg));
end;function EnableWheelHook: Boolean; stdcall; export;//█████████ 加载钩子
begin
lgf := '.\Hook.txt';
//QQ消息对话框
if hkQQChatTitle=0 then begin
hkQQChatTitle := SetWindowsHookEx(WH_CBT, @TitleHookProc, Hinstance, 0);
//hkQQChatTitle := SetWindowsHookEx(WH_SYSMSGFILTER, @TitleHookProc, Hinstance, 0);
Result := True;
end else Result := False;
end;function DisableWheelHook: Boolean; stdcall; export;//████████▌卸载钩子
begin
//QQ消息对话框
if hkQQChatTitle<>0 then begin
UnHookWindowsHookEx(hkQQChatTitle);
hkQQChatTitle := 0;
Result := True;
end else Result := False;
end;end.
主程序运行后,我试着重开很多应用的窗口,包括QQ的,打开了无数的聊天窗口,但日志文件中记录的信息中,只有主程序的,没有任何其它程序和窗口的:
15:45:18 HCBT_ACTIVATE, Form1
15:45:18 HCBT_SETFOCUS, Form1
15:45:20 HCBT_ACTIVATE, Formprj
15:45:20 HCBT_SETFOCUS, Formprj
15:45:20 HCBT_SYSCOMMAND,
15:45:20 HCBT_MINMAX
15:45:20 HCBT_SETFOCUS,
15:47:19 HCBT_CREATEWND,
15:47:19 HCBT_DESTROYWND,
15:47:19 HCBT_SYSCOMMAND,
16:29:03 HCBT_ACTIVATE, Form1
16:29:05 HCBT_SETFOCUS, Form1
16:29:28 HCBT_ACTIVATE, Formprj
16:29:28 HCBT_SYSCOMMAND,
16:29:28 HCBT_MINMAX
16:29:28 HCBT_SETFOCUS, Formprj
16:29:28 HCBT_SETFOCUS, Form1
16:29:28 HCBT_ACTIVATE, Form1
16:29:28 HCBT_SETFOCUS, Form1
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_CLICKSKIPPED,
16:29:30 HCBT_SYSCOMMAND,
16:29:30 HCBT_ACTIVATE, Formprj
16:29:30 HCBT_SETFOCUS, Formprj现在QQ窗口创建的消息倒是其次,其它的应用程序的窗口、对话框生成的消息也都没有捕获到,这就很奇怪了。难道 CBT 只能捕获调用它的主程序的消息么?那也太逊了吧,还是哪里设的有问题???