На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как считывать дополнительные клавиши G1 по G16 через RawInput, MFC?
    Добрый день! Подскажите, пожалуйста, как можно считывать дополнительные G1 по G16 клавиши на клавиатуре X7 G800V (см. прикрепленное изображение)?
    Прикреплённая картинка
    Прикреплённая картинка


    Пробую через RawInput, но при их нажатии никакие сообщения не приходят.

    ExpandedWrap disabled
      RAWINPUTDEVICE Rid = {};
      Rid.usUsagePage = 0x01;
      Rid.usUsage = 6; // HID_KEYBOARD//
      Rid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
      Rid.hwndTarget = hWnd;
      RegisterRawInputDevices(&Rid, 1, sizeof(RAWINPUTDEVICE))
      ...
    Сообщение отредактировано: ViH -
      В PreTranslateMessage, что-то попадает?

      Так пробовал? Так тоже ничего?
      ExpandedWrap disabled
        #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, если фокус не передан элементу управления
        }
        MaIron, спасибо за ответ, но на G-клавиши никак не реагирует ни в PreTranslateMessage ни в LowLevelKeyboardProc:

        ExpandedWrap disabled
          BOOL CGKeysDlg::PreTranslateMessage(MSG* pMsg)
          {
              if (pMsg->message == WM_KEYDOWN)
              {
                  Beep(9000, 600);
                  //На обычные клавиши сюда заходит, а на G — нет
              }
              return CDialogEx::PreTranslateMessage(pMsg);
          }

        ExpandedWrap disabled
          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;
              }
          ...
          А вообще, какие то сторонние приложения на их нажатия реагируют? Игры?
            Цитата MaIron @
            А вообще, какие то сторонние приложения на их нажатия реагируют? Игры?

            Их распознает программа MKey с подключенным плагином "USB HID". Если этот плагин в ней отключить, то перестает распознавать.
              Цитата ViH @
              Их распознает программа MKey с подключенным плагином "USB HID". Если этот плагин в ней отключить, то перестает распознавать.

              Разработчик оборудования, даже стандартного, может
              добавить туда не стандартные функции. Этими функциями
              можно воспользоваться через драйвер.
              Не исключено, что для пользования дополнительными
              дивайсами используется dll.
              Можно пытаться:
              1. Искать документацию и SDK на сайте производителя.
              Если получится, это самый лучший вариант.
              2. Запустить MKey и осмотреть процесс, на предмет
              поиска dll-и. Если она будет обнаружена, посмотреть на её экспортные
              функции. Перехватить их, по-исследовать итд
              Сообщение отредактировано: ЫукпШ -
              Подпись была выключена в связи с наложенным заземлением.
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0986 ]   [ 16 queries used ]   [ Generated: 23.07.19, 09:32 GMT ]