Итак, я решил, что сегодня хочу написать маленький кейлоггер, просто чтобы узнать о getAsyncKeyState. Я пытаюсь получить свой журнал для записи в файл, но содержимое файла либо отображается пустым, либо бросает на него произвольный адрес памяти (0x28fef0 раньше). Я слышал, что getAsyncKeyState не работает хорошо с Windows 7 x64, правда?getAsyncKeyState не распознает ввод ключа
Это довольно усугубляет, я надеялся, что на самом деле смогу это сделать сегодня вечером.
while(1)
{
Sleep(20);
for(DWORD_PTR key = 8; key <= 190; key++)
{
if (GetAsyncKeyState(key) == HC_ACTION)
checkKey(key);
}
}
Функция определения
void checkKey(DWORD_PTR key)
{
ofstream out;
out.open("log.txt");
if (key==8)
out << "[del]";
if (key==13)
out << "n";
if (key==32)
out << " ";
if (key==VK_CAPITAL)
out << "[CAPS]";
if (key==VK_TAB)
out << "[TAB]";
if (key==VK_SHIFT)
out << "[SHIFT]";
if (key==VK_CONTROL)
out << "[CTRL]";
if (key==VK_PAUSE)
out << "[PAUSE]";
if (key==VK_ESCAPE)
out << "[ESC]";
if (key==VK_END)
out << "[END]";
if (key==VK_HOME)
out << "[HOME]";
if (key==VK_LEFT)
out << "[LEFT]";
if (key==VK_UP)
out << "[UP]";
if (key==VK_RIGHT)
out << "[RIGHT]";
if (key==VK_DOWN)
out << "[DOWN]";
if (key==VK_SNAPSHOT)
out << "[PRINT]";
if (key==VK_NUMLOCK)
out << "[NUM LOCK]";
if (key==190 || key==110)
out << ".";
if (key >=96 && key <= 105)
{
key -= 48;
out << &key; // had ampersand
}
if (key >=48 && key <= 59)
out << &key; // amp'd
if (key !=VK_LBUTTON || key !=VK_RBUTTON)
{
if (key >=65 && key <=90)
{
if (GetKeyState(VK_CAPITAL))
out << &key; // amp;d
else
{
key = key +32;
out << &key; // amp'd
}
}
}
}
Я серьезно озадачен этим вопросом, и любая помощь будет принята с благодарностью. Почему функция, подобная этой, работает по-разному на 64-битной системе? Учитывая, что это единственный ящик, который у меня есть, я не могу запустить его на 32-разрядной версии, чтобы проверить, является ли это изолированной проблемой. Поскольку я предполагаю, что это связано с getAsyncKeyState, а не с моим кодом (который компилирует и создает пустой файл журнала), я включал только эти два фрагмента кода.
Если вы хотите получить состояние всей клавиатуры (т. Е. Все ключи), не делайте несколько вызовов в 'GetAsyncKeyState'. Вместо этого вызовите 'GetKeyboardState'. Это будет намного лучше.Но для ключевого регистратора вы хотите использовать клавиатурный крючок или слушать 'WM_KEYUP',' WM_KEYDOWN' и т. Д. –