如何利用钩子知道[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);
……
 
 
谢谢解答!

解决方案 »

  1.   

    我给你写了一个,你试试。
    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.
      

  2.   

    忘了给你注释了
    If iCode = HCBT_ACTIVATE then
    begin
      p:= PCBTActivateStruct(lParam);
      p.hWndActive//就是激活窗口的句柄。findwindow('#32770',nil)返回的是QQ聊天窗口的句柄                
    end;
      

  3.   

    http://community.csdn.net/Expert/topic/4233/4233383.xml?temp=.7277185
    求解谢谢。
      

  4.   

    To xixuemao(俺可是㊣②㈧经儿滴人):
     
    还是不好使啊,后来我也试了类似的方法,并且记入了日志: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 只能捕获调用它的主程序的消息么?那也太逊了吧,还是哪里设的有问题???
      

  5.   

    快下班了,如果可以你把你的demo发我邮箱里,我周末给你看看。[email protected]