想知道delphi钩子是如何使用的,比如用通过相关编程,如何控制指定的程序进行操作?
希望能给出例子源码!谢谢!高分奉上!

解决方案 »

  1.   

    unit hkprocunit;interfaceuses Windows,Messages,SysUtils,Dialogs,CommCtrl,StrUtils;var
      hHk: HHOOK;//钩子的句柄值。
      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; 
      end;
      Result :=True;
    end;
    function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam:LPARAM): LRESULT;stdcall;
    var
      MouseHookStruct: ^TMOUSEHOOKSTRUCT;//这个结构Delphi在Windows单元有定义,直接用就可以了。
      nState: SHORT;//得到键盘状态的GetKeyState函数的返回值。这是一个16位的数。
    begin
      Result := 0; //最好首先给它一个返回值,不然会有警告的!记住这可不是C语言。
      //当nCode小于0时表示还有其它的Hook必须把参数传给它。
      //此时就要用Api函数CallNextHookEx让它调用下一个Hook!!!当然不用好像也可以。
      if nCode<0 then
        Result := CallNextHookEx(hHk,nCode,WParam,LParam)//参数是现成的,直接用就可以了。    //详细的说明可以参考Win32 SDK
      else
      if wParam = WM_LBUTTONDBLCLK then //判断是不是鼠标左键双击事件
      begin
        nState := GetKeyState(VK_CONTROL);//这个函数只有一个参数,就是要得到的键的//键值,这里用Windows的虚拟键值表示ctrl键。
        if (nState and $80000000) = $80000000 then//如果按下了,那么返回值的最高位为1
        begin //即是16进制的80000000,如果没有按下就返回0
          MouseHookStruct := Pointer(LParam); //转换指针并付值给MouseHookStruct变量。
          SendMessage(MouseHookStruct.hwnd,WM_PASTE,0,0);//如果条件都满足了就发送WM_PASTE(粘贴)消息
        end;
      end;
    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;在网上找的源码,我试过了,也不能控制最新版的QQ啦!
    有没有谁做了改进,可以控制任何一个程序,只要传入进程名称就可以控制操作就最好!
      

  2.   

    首先要谢谢HSFZXJY的分享还有没有更好的东西啊?!
    请高手们帮帮忙啦!
    谢谢!
      

  3.   

    在form.OnKeyDOWN中写:if key=vk_return then begin sleep(5000); Sendmessage(GetActiveWindow,WM_KEYDOWN,VK_F12,0); end;
    不好意思,我用手机写的。。
      

  4.   

    主要是想控制制定的在本机运行的系统进行操作,
    比如想控制QQ进行聊天,先判断是否是某某Q友,是的话就自动输入"XXX”并且发送
      

  5.   

    ???QQ又没有写成OLE,你怎么控制?想写聊天软件就自己用socket写一个吧!不过估计市场不好,呵呵
      

  6.   

    你这个钩子,只能钩delphi自己,不能钩别的程序了吗?
    我的意思是要能钩其他的软件,就Windows软件就可以啦,不要求去钩什么web之类的!