Здравствуйте, AlexJH, Вы писали:
AJH>Я запускаю приложение, делаю его неактивным (т.к. хук не перехватывает нажатие клавиш на консоль), щёлкаю любую клавишу, и получаю PROVERKA.jpg на диске c:\.
AJH>Проблема: стоит мне заменить "c:\\PROVERKA.jpg" на "PROVERKA.jpg" или любое другое имя без абсолютного пути ("xxx.xxx"), то всё совершенно меняется. Поведение: запускаю программу, убираю на задний фон, щёлкаю любую клавишу — ничего не происходит. Когда в конце приложения выскакивает
AJH>MessageBox(NULL,L"text",L"title",NULL), то только тогда, делая активным любое окно (даже консоль), я получаю PROVERKA.jpg в той же папке, что и программа.
AJH>Как вообще такое может быть? Чем абсолютный путь так кардинально отличается от относительного в моей программе?
Вы ставите глобальный хук. Ваша длл загружается в адресные пространства приложений. Если указываете полный путь "c:\file.dmp", то все будет записываться именно в этот файл от всех приложений. А когда указываете просто "file.dmp", то файл этот будет создаваться в папке каждого графического приложения, которое на момент нажатия клавиши активно.
По поводу консольного приложения и перехвата нажатий в консоле...
Нужно вызывать SetWindowsHookEx с WH_KEYBOARD_LL и также в длл создавать дополнительный поток:
LPTHREAD_START_ROUTINE WINAPI DispatchHookMsgThreadFunc(PVOID) {
MSG msg;
while( GetMessage(&msg, NULL, 0, 0) ) {
DispatchMessage(&msg);
}
return 0;
}
Таким образом можно будет отлавливать клавиши во всех графических приложениях включая cmd.
Почитайте про WH_KEYBOARD_LL
тут.