Знову ж таки телепатично провижу, що "не працює" - це hKey дорівнює 0 (що, до речі, документація не гарантує у випадку помилки, читайте уважніше). А це тому, що програма запускається без адмінправ, а без них HKEY_LOCAL_MACHINE на запис, швидше за все, недоступний. Зате доступний HKEY_CURRENT_USER, про що я вже писав.
Ну і пара дрібниць:
- уникайте "магічних" констант чи хоча б пишіть їх якомога ближче до того, що в документації: не зовсім зрозуміло, що -32767 - це два байти зі встановленими першим і останнім бітами, навіть 0x8001 краще, а названа константа - ще краще;
- FindWindow знаходить будь-яке вікно з відповідними характеристиками, а вам треба, я так розумію, GetConsoleWindow;
- змінні бажано проголошувати якомога ближче до використання, і надавати їм значення відповідно до їхнього типу:
for(char key='\b';key<='\190';key++)
що таке те 190, до речі?
- checkSpecial повертає false лише у випадку default; може, перейменувати функцію та запхати гілку з !checkSpecial в її default?
- у fstream дуже хороші конструктор, деструктор та operator bool:
{
fstream f("KeyLogger.txt", ios::app); //одразу відкрити
if(f) //закритий чи збійний поверне false
{
f<<key;//key і так char
}
} //при виході з блоку, де створювався fstream, він буде закритий деструктором