Re: хук на клавитару - проблема
От: -prus-  
Дата: 17.07.09 06:56
Оценка: 3 (1)
Здравствуйте, 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 тут.
С уважением,
Евгений
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.