万分感谢!
愿以全部分数赠送!
[email protected]
[email protected]

解决方案 »

  1.   

    也给我发一份吧,谢了!
    [email protected]
      

  2.   

    不会是屏幕取词吧,那我也要一份,谢谢
    [email protected]
      

  3.   

    钩子函数的应用  
        
      
      --------------------------------------------------------------------------------
        
      作者:吴燕  刘宏波      
              
                摘    要:介绍了钩子的有关知识,并给出了在Delphi环境下编写的键盘鼠标钩子的程序示例。
                关键词:钩子;键盘钩子;鼠标钩子;Delphi
                
                钩子是Windows中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目的地之前截获它们并根据用户要求做出相应处理。钩子的种类很多其作用也不同,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。钩子分为线程专用钩子和全局钩子,线程专用钩子只监视指定的线程,要监视系统中的所有线程,必须用到全局钩子。对于全局钩子,钩子函数必须包含在独立的动态链接库(DLL)中,这样才能被各种相关联的应用程序调用。
                ~~一、钩子函数简介
                Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows消息,函数语法为:
                SetwindowsHookEx  (idHook:Integer;lpfn:TFNHookProc;hmod:  HINST;dwThreadId:DWORD)
                其中参数idHook指定建立的监视函数类型。通过Windows  MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同的消息监视类型,而WH_JOURNALRECORD和WH_JOURNALPLAYBACK是用来监视键盘和鼠标操作的。参数lpfn指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。函数的一般形式为:
                Hookproc  (icode:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT;stdcall;  
                其中icode为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。只要在程序中建立这样一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。在不需要监视系统消息时可以调用UnHookWindowsHookEx来解除对消息的监视。WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠标、键盘消息。
                
                ~~二、钩子程序的实例
                在本程序中建立了两个消息函数,一个用于纪录鼠标、键盘的动作并保存,另一个用于将保存的动作返给系统回放。在Delphi中建立一个工程,在Form1上添加3个按钮用于程序操作。另外再添加一个Edit控件用于验证操作。以下程序在Delphi6.0、Windows98环境下调试通过。
                unit  Unit1;
                interface
                uses      Windows,  Messages,  SysUtils,  Classes,  Graphics,  Controls,  Forms,
                              Dialogs,  StdCtrls;
                type
                    TForm1  =  class(TForm)
                    Button1:  TButton;
                    Button2:  TButton;
                    Button3:  TButton;
                    Edit1:  TEdit;
                    procedure  FormCreate(Sender:  TObject);
                    procedure  Button1Click(Sender:  TObject);
                    procedure  Button2Click(Sender:  TObject);
                    procedure  Button3Click(Sender:  TObject);
                    private
                    {  private  declarations  }
                    public
                    {  public  declarations  }
                    end;
                var
                    Form1:  TForm1;
                    EventArr:array[0..1000]of  EVENTMSG;
                    EventLog:Integer;
                    PlayLog:Integer;
                    hHook,hPlay:Integer;
                    recOK:Integer;
                    canPlay:Integer;
                    bDelay:Bool;
                implementation
                {$R  *.DFM}
                function  PlayProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
                begin
                    canPlay:=1;
                    Result:=0;
                    if  iCode  <    0  then  //必须将消息传递到钩子链的下一个处理程序
                    Result  :=  CallNextHookEx(hPlay,iCode,wParam,lParam)
                    else  if  iCode  =  HC_SYSMODALON  then    canPlay:=0
                    else  if  iCode  =  HC_SYSMODALOFF  then    canPlay:=1
                    else  if  ((canPlay  =1  )and(iCode=HC_GETNEXT))  then  begin
                    if  bDelay  then  begin
                    bDelay:=False;
                    Result:=50;
                    end;
                    pEventMSG(lParam)^:=EventArr[PlayLog];
                    end
                    else  if  ((canPlay  =  1)and(iCode  =  HC_SKIP))then  begin
                    bDelay  :=  True;
                    PlayLog:=PlayLog+1;
                    end;
                    if  PlayLog>  =EventLog  then  begin
                    UNHookWindowsHookEx(hPlay);
                    end;
                end;
                function  HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
                begin
                    recOK:=1;
                    Result:=0;  
                    if  iCode  <    0  then
                    Result  :=  CallNextHookEx(hHook,iCode,wParam,lParam)
                    else  if  iCode  =  HC_SYSMODALON  then    recOK:=0
                    else  if  iCode  =  HC_SYSMODALOFF  then    recOK:=1
                    else  if  ((recOK>  0)  and  (iCode  =  HC_ACTION))  then  begin
                    EventArr[EventLog]:=pEventMSG(lParam)^;
                    EventLog:=EventLog+1;
                    if  EventLog>  =1000  then  begin
                    UnHookWindowsHookEx(hHook);
                    end;
                    end;
                end;
                procedure  TForm1.FormCreate(Sender:  TObject);
                begin
                    Button1.Caption:='纪录';
                    Button2.Caption:='停止';
                    Button3.Caption:='回放';
                    Button2.Enabled:=False;
                    Button3.Enabled:=False;
                end;
                procedure  TForm1.Button1Click(Sender:  TObject);
                begin
                    EventLog:=0;
                    //建立键盘、鼠标操作消息纪录链
                    hHook:=SetwindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
                    Button2.Enabled:=True;
                    Button1.Enabled:=False;
                end;
                procedure  TForm1.Button2Click(Sender:  TObject);
                begin
                    UnHookWindowsHookEx(hHook);
                    hHook:=0;
                    Button1.Enabled:=True;
                    Button2.Enabled:=False;
                    Button3.Enabled:=True;
                end;
                procedure  TForm1.Button3Click(Sender:  TObject);
                begin
                    PlayLog:=0;
                    //建立键盘鼠标操作消息纪录回放链
                    hPlay:=SetwindowsHookEx(WH_JOURNALPLAYBACK,PlayProc,
                    HInstance,0);  
                    Button3.Enabled:=False;
                end;  
                end.  
                运行程序,点击“纪录”按钮开始纪录操作,这时你可以在文本控件中输入一些文字,然后点击“停止”按钮停止纪录,再点击“回放”按钮就可以将先前所做的操作回放。在上面的程序中,HookProc是纪录操作的消息函数,每当有鼠标、键盘消息发生时,系统都会调用该函数,消息信息就保存在地址lParam中,PlayProc是消息回放函数,当系统执行消息回放时调用该函数,程序就将先前纪录的消息值返回到lParam指向的区域中,系统就会执行该消息,从而实现了消息回放。
                
                ~~三、小结
                Hook是应用程序在Microsoft  Windows  消息处理过程中设置的用来监控消息流并且处理系统中尚未到达目的窗口的某一类型消息过程的机制。这可以帮助应用程序实现实现某些特殊目的,如控制键盘或鼠标的输入消息,监视窗口的打开关闭以及实现记录宏等等,应用灵活,功能强大。如果Hook过程在应用程序中实现,若应用程序不是当前窗口时,该Hook就不起作用;如果Hook在DLL中实现,程序在运行中动态调用它,它能实时对系统进行监控。
                
      

  4.   

    谢谢cobi(小新),用钩子截取到字符(例如获取QQ密码)不难,
    不过我的意思是说如何截取到汉字,例如截获在WORD文档里面输入的汉字
      

  5.   

    已发送,请查收!!!
    内在源码??在Delphi5.0下编译通过!!
      

  6.   

    我也要:[email protected] 谢谢!
      

  7.   

    也给我一份:[email protected] 多谢
      

  8.   

    请给我一份:[email protected]
    十分感谢!
      

  9.   

    妈妈,也想!
    [email protected]
    谢了!
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。0D
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。
    0A
    ★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  10.   


    [email protected]  thanks !!!