delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
要如何禁止键盘钩子? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiAPI/html/delphi_20061126120722169.html
很多游戏都有这个功能,来防止盗号。  
   
   
  不知道   这是怎么做到的?  
  能不能说说原理?

帮你顶

屏蔽键盘鼠标事件  
   
  //请试一试该程序  
  var  
    YourHook:   HHOOK;  
   
  //定义用于HOOK的消息,也可以是windows的标准消息  
  const  
    WM_YourMessage   =   WM_USER   +   2000;  
   
  //发送你需要的消息  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
    PostMessage(self.Handle,WM_YourMessage,0,0);  
  end;  
   
  //你的HOOK处理函数  
  function   YourHookProc(Code:   Integer;   WParam:   Longint;   var   Msg:   TMsg):   Longint;   stdcall;  
  begin  
  //     if   (Code   =   HC_ACTION)   then  
        if   Msg.Message   =   WM_YourMessage   then  
          //调用你自己的HOOK函数  
          begin  
              showMessage('截获该消息');  
      end;  
    Result   :=   CallNextHookEx(YourHook,   Code,   WParam,   Longint(@Msg));  
  end;  
   
  //安装HOOK  
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
    YourHook   :=     SetWindowsHookEx(WH_GETMESSAGE,   @YourHookProc,   0,   GetCurrentThreadID);  
  end;      
   
  ===========================  
   
  帮LZ找的资料```

日志钩子(JournalRecord   Hook)的使用    
  ----   钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。钩子分为线程专用钩子和全局钩子,线程专用钩子只监视指定的线程,要监视系统中的所有线程,必须用到全局钩子。对于全局钩子,钩子函数必须包含在独立的动态链接库(DLL)中,这样才能被各种相关联的应用程序调用。在WINDOWS中,日志钩子是个很特别的钩子,它只有全局钩子一种,是键盘鼠标等输入设备的消息在系统消息队列被取出时发生的,而且系统中只能存在一个这样的日志钩子,更重要是,它不必用在动态链接库中,这样可以省却了为安装一个全局钩子而建立一个动态链接库的麻烦。利用日志钩子,我们可以监视各种输入事件,下面的示例可以用来记录键盘的输入,当有按键发生时,自动记录按键动作的日期和时间以及当前激活的窗口名称。本示例在中文WIN98,Borland   C++   Builder4中编译通过。    
   
  ----   1.新建一个工程,在窗体Form1中放置两个按钮Button1和Button2,   CAPTION分别为“安装日志钩子”和“卸载日志钩子”。    
   
  ----   2.   定义如下全局变量:    
   
  HHOOK   g_hLogHook=NULL;           //钩子变量  
  HWND   g_hLastFocus=NULL;            
  //记录上一次得到焦点的窗口句柄  
  const   int   KeyPressMask=0x80000000;     //键盘掩码常量  
  char   g_PrvChar;             //保存上一次按键值  
   
  3.在Button1的OnClick事件中输入:  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
    {  
      if     (g_hLogHook==NULL)  
        g_hLogHook   =   SetWindowsHookEx  
  (WH_JOURNALRECORD,  
                  (HOOKPROC)JournalLogProc,  
  HInstance,0);     //安装日志钩子  
    }  
   
  4.在Button2的OnClick事件中输入:  
   
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
    if   (g_hLogHook!=NULL)  
      {UnhookWindowsHookEx(g_hLogHook);  
        g_hLogHook=NULL;  
      }     //卸载日志钩子  
  }  
   
  5.输入钩子回调函数:  
  HOOKPROC   JournalLogProc(int   iCode,    
  WPARAM   wParam,   LPARAM   lParam)  
  {  
    if   (iCode<   0)   return   (HOOKPROC)CallNextHookEx  
  (g_hLogHook,iCode,wParam,lParam);  
    if   (iCode==HC_ACTION)  
      {EVENTMSG   *pEvt=(EVENTMSG   *)lParam;  
        int   i;  
        HWND   hFocus;             //保存当前活动窗口句柄  
        char   szTitle[256];           //当前窗口名称  
        char   szTime[128];         //保存当前的日期和时间  
        FILE   *stream=fopen(“c:\\logfile.txt”,"a+t");  
        if   (pEvt->message==WM_KEYDOWN)            
          {int   vKey=LOBYTE(pEvt-   >paramL);         //   取得虚拟键值  
            char   ch;  
            char   str[10];  
            hFocus=GetActiveWindow();            
      //取得当前活动窗口句柄  
            if(g_hLastFocus!=hFocus)            
      //当前活动窗口是否改变  
              {GetWindowText(hFocus,szTitle,256);  
                g_hLastFocus=hFocus;  
                strcpy(szTime,DateTimeToStr(Now())  
  .c_str());     //得到当前的日期时间  
                fprintf(stream,"%c%s%c%c%s",  
  10,szTime,32,32,szTitle);     //写入文件  
                fprintf(stream,"%c%c",32,32);      
              }  
            int   iShift=GetKeyState(0x10);      
  //测试SHIFT,CAPTION,NUMLOCK等键是否按下  
            int   iCapital=GetKeyState(0x14);  
            int   iNumLock=GetKeyState(0x90);  
            bool   bShift=(iShift   &   KeyPressMask)==KeyPressMask;        
            bool   bCapital=(iCapital   &   1)==1;  
            bool   bNumLock=(iNumLock   &   1)==1;  
            if   (vKey   >=48   &&   vKey<   =57)    
    //   数字0-9  
                if   (!bShift)   fprintf(stream,"%c",vKey);  
            if   (vKey   >=65   &&   vKey<   =90)    
  //   A-Z               a-z  
              {if   (!bCapital)  
                    if   (bShift)   ch=vKey;   else   ch=vKey+32;  
                else  
                    if   (bShift)   ch=vKey+32;   else   ch=vKey;  
                fprintf(stream,"%c",ch);  
              }  
            if   (vKey   >=96   &&   vKey<   =105)                   //   小键盘0-9  
                if   (bNumLock)   fprintf(stream,"%c",vKey-96+48);  
            if   (vKey>=186   &&   vKey<=222)                   //   其他键  
              {switch   (vKey)  
                  {case   186:if   (!bShift)   ch=';';   else   ch=':';break;  
                    case   187:if   (!bShift)   ch='=';   else   ch='+';break;  
                    case   188:if   (!bShift)   ch=',';   else   ch='<'   ;break;  
                    case   189:if   (!bShift)   ch='-';   else   ch='_';break;  
                    case   190:if   (!bShift)   ch='.';   else   ch='   >';break;  
                    case   191:if   (!bShift)   ch='/';   else   ch='?';break;  
                    case   192:if   (!bShift)   ch='`';   else   ch='~';break;  
                    case   219:if   (!bShift)   ch='[';   else   ch='{';break;  
                    case   220:if   (!bShift)   ch='\\';   else   ch='|';break;  
                    case   221:if   (!bShift)   ch=']';   else   ch='}';break;  
                    case   222:if   (!bShift)   ch='\'';   else   ch='\"';break;  
                    default:ch='n';break;  
                  }  
                if   (ch!='n')   fprintf(stream,"%c",ch);  
              }  
  //           if   (wParam   >=112   &&   wParam<=123)          
    //   功能键       [F1]-[F12]  
            if   (vKey   >=8   &&   vKey<   =46)       //方向键  
              {switch   (vKey)  
                  {case   8:strcpy(str,"[BK]");break;  
                    case   9:strcpy(str,"[TAB]");break;  
                    case   13:strcpy(str,"[EN]");break;  
                    case   32:strcpy(str,"[SP]");break;  
                    case   33:strcpy(str,"[PU]");break;  
                    case   34:strcpy(str,"[PD]");break;  
                    case   35:strcpy(str,"[END]");break;  
                    case   36:strcpy(str,"[HOME]");break;  
                    case   37:strcpy(str,"[LF]");break;  
                    case   38:strcpy(str,"[UF]");break;  
                    case   39:strcpy(str,"[RF]");break;  
                    case   40:strcpy(str,"[DF]");break;  
                    case   45:strcpy(str,"[INS]");break;  
                    case   46:strcpy(str,"[DEL]");break;  
                    default:ch='n';break;  
                  }  
                if   (ch!='n')  
                  {if   (g_PrvChar!=vKey)  
                      {fprintf(stream,"%s",str);  
                        g_PrvChar=vKey;  
                      }  
                  }  
              }  
  }  
              if  
  (pEvt-   >message==WM_LBUTTONDOWN   ||   pEvt-   >message  
  ==WM_RBUTTONDOWN)  
              {hFocus=GetActiveWindow();  
                if   (g_hLastFocus!=hFocus)  
                  {g_hLastFocus=hFocus;  
                    GetWindowText(hFocus,szTitle,256);                
            strcpy(szTime,DateTimeToStr(Now()).c_str());      
  //得到当前的日期时间  
            fprintf(stream,"%c%s%c%c%s",  
  10,szTime,32,32,szTitle);     //写入文件  
            fprintf(stream,"%c%c",32,32);      
                  }  
              }  
    fclose(stream);  
    return   (HOOKPROC)CallNextHookEx  
  (g_hLogHook,iCode,wParam,lParam);  
  }  
 

http://dev.cbw.com/cbuilder/api/20055245505_2738869.shtml

转贴:  
  “证券大盗”实质上是利用键盘钩子技术进行做案的,他们最关心的是键盘消息“钩子”(WH_KEYBOARD   Hook)。对付此类病毒的有效措施是以毒攻毒,以键盘钩子对付键盘监视:即在应用程序中需要键盘输入的时候,应用程序自己创建并安装一个键盘监视钩子,并使其处于钩子链的顶端,这样键盘输入的消息将被自己的钩子处理程序截获。只要在钩子处理程序中不再调用CallNextHookEx函数,即不把消息传递给下面的钩子

不知道管不管用,测试先。  
      谢谢大家啦~

posted on 2008-11-27 21:12 delphi2007 阅读(296) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。