Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.216.163] |
|
Сообщ.
#1
,
|
|
|
Добрый день! Подскажите, пожалуйста, как можно считывать дополнительные G1 по G16 клавиши на клавиатуре X7 G800V (см. прикрепленное изображение)?
Прикреплённая картинка
Пробую через RawInput, но при их нажатии никакие сообщения не приходят. RAWINPUTDEVICE Rid = {}; Rid.usUsagePage = 0x01; Rid.usUsage = 6; // HID_KEYBOARD// Rid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK; Rid.hwndTarget = hWnd; RegisterRawInputDevices(&Rid, 1, sizeof(RAWINPUTDEVICE)) ... |
Сообщ.
#2
,
|
|
|
В PreTranslateMessage, что-то попадает?
Так пробовал? Так тоже ничего? #include "stdafx.h" HHOOK keyHook = NULL; #define KEY_EVENT_MASK 7 //Функции перехвата void KeyDownEvent(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) { outInput->ki.dwFlags = 0; outInput->ki.wVk = msg->vkCode; outInput->ki.wScan = msg->scanCode; } void KeyUpEvent(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) { outInput->ki.dwFlags = KEYEVENTF_KEYUP; outInput->ki.wVk = msg->vkCode; outInput->ki.wScan = msg->scanCode; } void SystemKeyDownEvent(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) { outInput->ki.dwFlags = 0; outInput->ki.wVk = msg->vkCode; outInput->ki.wScan = msg->scanCode; } void SystemKeyUpEvent(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) { outInput->ki.dwFlags = KEYEVENTF_KEYUP; outInput->ki.wVk = msg->vkCode; outInput->ki.wScan = msg->scanCode; } void(*keyEventConvertors[KEY_EVENT_MASK])(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) = { KeyDownEvent, KeyUpEvent, 0, 0, SystemKeyDownEvent, SystemKeyUpEvent }; //Блок доступа к командам ввода LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode != HC_ACTION) return CallNextHookEx(0, nCode, wParam, lParam); LPKBDLLHOOKSTRUCT msg = (LPKBDLLHOOKSTRUCT)lParam; if (wParam == WM_KEYDOWN) { //Что здесь выдает ? //msg->vkCode; return 0; } void(*eventConvertor)(LPKBDLLHOOKSTRUCT msg, INPUT *outInput) = keyEventConvertors[wParam & KEY_EVENT_MASK]; if (eventConvertor == 0) return 0; INPUT input = { INPUT_KEYBOARD }; eventConvertor(msg, &input); return 0; } BOOL CMyDlg::OnInitDialog() { CDialogEx::OnInitDialog(); keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); return TRUE; // возврат значения TRUE, если фокус не передан элементу управления } |
Сообщ.
#3
,
|
|
|
MaIron, спасибо за ответ, но на G-клавиши никак не реагирует ни в PreTranslateMessage ни в LowLevelKeyboardProc:
BOOL CGKeysDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { Beep(9000, 600); //На обычные клавиши сюда заходит, а на G — нет } return CDialogEx::PreTranslateMessage(pMsg); } LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode != HC_ACTION) return CallNextHookEx(0, nCode, wParam, lParam); LPKBDLLHOOKSTRUCT msg = (LPKBDLLHOOKSTRUCT)lParam; if (wParam == WM_KEYDOWN) { Beep(9000, 600); //На обычные клавиши сюда заходит, а на G — нет return 0; } ... |
Сообщ.
#4
,
|
|
|
А вообще, какие то сторонние приложения на их нажатия реагируют? Игры?
|
Сообщ.
#5
,
|
|
|
Цитата MaIron @ А вообще, какие то сторонние приложения на их нажатия реагируют? Игры? Их распознает программа MKey с подключенным плагином "USB HID". Если этот плагин в ней отключить, то перестает распознавать. |
Сообщ.
#6
,
|
|
|
Цитата ViH @ Их распознает программа MKey с подключенным плагином "USB HID". Если этот плагин в ней отключить, то перестает распознавать. Разработчик оборудования, даже стандартного, может добавить туда не стандартные функции. Этими функциями можно воспользоваться через драйвер. Не исключено, что для пользования дополнительными дивайсами используется dll. Можно пытаться: 1. Искать документацию и SDK на сайте производителя. Если получится, это самый лучший вариант. 2. Запустить MKey и осмотреть процесс, на предмет поиска dll-и. Если она будет обнаружена, посмотреть на её экспортные функции. Перехватить их, по-исследовать итд |