Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.12.2012, 20:14   #1
lowercase
Форумчанин
 
Регистрация: 15.05.2010
Сообщений: 88
Репутация: 35
По умолчанию Прерывания

Здраствуйте. Не уверен, что правильно назвал тему(не знаю как иначе назвать). Стоит задача - с помощью прерываний(или любым другим образом, но желательно с помощью winapi, хотя и не обязательно) подменить одну клавишу другой. Как-то так. Что меется ввиду? Например, я жму клавишу F система должна "думать", что я нажал, например, клавишу L и наоборот. Ну или если я нажал Enter, то система должна реагировать так, как будто это было нажатие Escape. То есть для двух любых клавиш нужно сделать смену ролей
Ссылки и примеры кода приветсвуются.
Заранее спасибо.

Последний раз редактировалось lowercase; 19.12.2012 в 20:17.
lowercase вне форума   Ответить с цитированием
Старый 19.12.2012, 23:57   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,873
Репутация: 1915
По умолчанию

Можно сделать другую раскладку клавиатуры, либо через клавиатурный драйвер.
waleri вне форума   Ответить с цитированием
Старый 21.12.2012, 01:19   #3
Smogg
Профессионал
 
Регистрация: 14.06.2011
Сообщений: 1,154
Репутация: 354
По умолчанию

Алгоритм такой:

Читаешь про HHOOK WINAPI SetWindowsHookEx(
_In_ int idHook,
_In_ HOOKPROC lpfn,
_In_ HINSTANCE hMod,
_In_ DWORD dwThreadId
);

idHook делаешь равным WH_KEYBOARD_LL.

Потом в LowLevelKeyboardProc() в параметре lParam получаешь ссылку на структуру:

typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT, *LPKBDLLHOOKSTRUCT;

Ee модифицуруешь как хочешь, и через CallNextHookEx() отправляешь дальше по цепочке хуков.

Правда, я не знаю, позволит ли система так в лоб изменить/подменить lParam.

Если нельзя, то в LowLevelKeyboardProc генерирушь свое событие клавиатуры через keybd_event(), и возвращашь какой-нить мусор, кроме нуля.
Только в этом случае надо проверить, чтобы не было флага LLKHF_INJECTED, если есть - возвращать ноль, или, как надо делать правильно, вызывать CallNextHookEx(), иначе уйдешь в цикл.
Smogg вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывания kolyan147 Assembler 0 13.06.2012 23:55
прерывания lilek Assembler 2 14.12.2010 21:44
Прерывания alexdrew Assembler 1 16.05.2010 00:38
прерывания sergei64_89 Assembler 3 22.04.2008 13:37


07:58.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru