Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145

Глобальный хук клавиатуры с целью изменить клавишу

06.01.2019, 00:19. Показов 2551. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Возможно ли с помощью глобального хука клавиатуры (SetWindowsHookEx, WH_KEYBOARD_LL) изменить получаемую им клавишу
(при этом изменить так, чтобы до всех получателей дошла именно измененная версия этой клавиши)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2019, 00:19
Ответы с готовыми решениями:

Глобальный хук клавиатуры (windows)
Как программно можно остледить нажатие клавиши, если активно другое окно? Поиском нашёл GetAsyncKeyState, но она не подходит, т.к. данный...

Глобальный хук клавиатуры
Привет. Мне нужно сделать глобальный хук клавиатуры, но я не знаю как. В интернете примеров на C++ мало и все не работают, потому что люди...

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

10
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
06.01.2019, 15:26
То есть вы хотите, допустим, если пользователь нажал А при вводе, то вместо А отобразилась Б?

Добавлено через 11 минут
Если да, то есть функция CallNextHookEx. При вызове этой функции:
- HHOOK hhk просто игнорируется (передаете просто nullptr),
- int nCode передаете сюда первый аргумент вашей callback-функции,
- wParam - сюда передаете тип события клавиатуры (WM_KEYDOWN, WM_KEYUP),
- lParam - сюда передаете объект структуры KBDLLHOOKSTRUCT указав нужную клавишу
Дополнительно:
https://msdn.microsoft.com/ru-... s.85).aspx

Добавлено через 10 минут
В вашей callback-функции пишите
C++
1
return CallNextHookEx(nullptr, nCode, WH_KEYBOARD_LL, kbdllhookstructObject);
Добавлено через 2 часа 4 минуты
Еще как вариант использовать функцию keybd_event
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
06.01.2019, 17:06  [ТС]
Верно, хочу, чтобы при вводе А отобразилось Б.
Так и делаю.
Вот, сами смотрите.
Но ничего при этом не работает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<windows.h>
#include<sstream>
 
LRESULT CALLBACK llkp(int nCode, WPARAM wParam, LPARAM lParam){
 
    PKBDLLHOOKSTRUCT p=(PKBDLLHOOKSTRUCT)lParam;
    if(nCode==HC_ACTION && p->vkCode==VK_SPACE)p->vkCode=90; //Если кликнули на "Space", то изменяем на "Z".
 
    return CallNextHookEx(0,nCode,wParam,(LPARAM)p);
 
}
 
void main(){
 
    if(!SetWindowsHookEx(WH_KEYBOARD_LL,llkp,0,0))printf("\n#SWHE: %08x",GetLastError());
 
    MSG msg=MSG();
    while(GetMessage(&msg,0,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
}
0
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
06.01.2019, 18:05
В структуре, которая хранит виртуальный код, есть еще скан-код. Думаю, что там нужно тоже заменить нажатую клавишу на нужную вам.

Добавлено через 1 минуту
Попробуйте сделать не через CallNextHookEx, а через keybd_event

Добавлено через 59 секунд
Для того, чтобы получить скан-код используйте
C++
1
MapVirtualKey(vk, MAPVK_VK_TO_VSC);
Добавлено через 1 минуту
Использовать keybd_event будет проще.
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
06.01.2019, 18:45  [ТС]
Ну вот я заменил vkCode и scanCode. Не помогло.
А вот keybd_event мне не подойдёт
Мне нужно решить эту проблему именно посредством аргументов Callback'a (изменив их и направив в CallNextHookEx).
0
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
06.01.2019, 19:19
Цитата Сообщение от marick0073 Посмотреть сообщение
А вот keybd_event мне не подойдёт
Вы уверены? Считайте, что вы приняли событие, если это нажатие нужной клавиши, то вы просто отправили новое событие, а это просто дальше не передаете по цепочке хуков. Если же нажатие не нужной вам кнопки, то вы просто пишите
C++
1
return CallNextHookEx(0,nCode,wParam,lParam);
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
06.01.2019, 20:16  [ТС]
Уверен.
Мне просто не нравится тот факт, что при нажатии нужной мне клавиши она мелькнёт в хуке два раз (первый раз от имени пользователя (даже несмотря на то, что она будет блокироваться), второй раз как симуляция).
0
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
06.01.2019, 21:24
Можно текущий код вашего обработчика?
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
07.01.2019, 05:46  [ТС]
Да, конечно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<windows.h>
#include<sstream>
 
LRESULT CALLBACK llkp(int nCode, WPARAM wParam, LPARAM lParam){
 
    PKBDLLHOOKSTRUCT p=(PKBDLLHOOKSTRUCT)lParam;
    if(nCode==HC_ACTION && p->vkCode==0x58){ //Если кликнули на "X", то изменяем на "Space".
        p->vkCode=32;
        p->scanCode=57;
    }
 
    return CallNextHookEx(0,nCode,wParam,(LPARAM)p);
 
}
 
void main(){
 
    if(!SetWindowsHookEx(WH_KEYBOARD_LL,llkp,0,0))printf("\n#SWHE: %08x",GetLastError());
 
    MSG msg=MSG();
    while(GetMessage(&msg,0,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
}
0
134 / 26 / 8
Регистрация: 09.02.2017
Сообщений: 175
07.01.2019, 15:45
Вам нужно менять клавиши на разные клавиши? То есть какое кол-во клавиш, которыми вы будете заменять нажатые клавиши? Или вы просто будете менять, допустим, z на x, а x на z и так со всеми клавишами?

Добавлено через 31 минуту
Наверное, больше ничем помочь не могу(
Вот дополнительные ссылки, посмотрите:
http://www.cplusplus.com/forum/windows/7354/
https://stackoverflow.com/ques... -a-hookc-c
Ссылки нашел по запросу " change pressed key in hook winapi ". Если найдете решение, отпишитесь. Удачи)
0
3 / 3 / 1
Регистрация: 06.07.2014
Сообщений: 145
07.01.2019, 20:05  [ТС]
Нужно просто изменить нажатую пользователем клавишу на другую
(то есть, кликнул на одну клавишу, а в итоге получилось, что он кликнул на другую).
Окей
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.01.2019, 20:05
Помогаю со студенческими работами здесь

KeyLogger (глобальный хук клавиатуры)
Не могу найти информацию по созданию кейлогера. Кто может помочь исходником или материалом?

KeyboardProc, глобальный хук клавиатуры, dll
Написал dll для установки хука на клаву, по книге &quot;Нестандартные приемы программирования на Delphi (Ю. Ревич)&quot; Программа должна...

Глобальный хук клавиатуры/мыши в Lazarus
Здравствуйте, не подскажете, что лучше использовать для глобального хука клавиатуры/мыши? Мне нужно, чтобы обрабатывался ввод...

На глобальный хук клавиатуры ругаются антивирусники
Написал программу, которая глобально хукает одну клавишу без использования .dll проблема в том, что, когда пытаюсь выложить на любой...

Глобальный хук клавиатуры для системных приложений. Почему зависает?
Здравствуйте. Имеется задача: перехватывать нажатие клавиш во всей системе. После изучения статей про хуки написал что-то очень...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru