Управление для получения горячих клавиш, таких как вкладка и пробел - PullRequest
1 голос
/ 30 сентября 2008

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

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

1 Ответ

1 голос
/ 01 октября 2008

Одним из вариантов обходного решения будет использование стандартного стандартного элемента управления для редактирования с функцией перехвата сообщений.

Это позволит вам перехватить сообщения клавиатуры WM_KEYDOWN , отправленные этому элементу редактирования.

Функция подключения будет выглядеть примерно так:

    LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
    {
      LRESULT lResult = 0;

      if ((code >= 0) && (code == MSGF_DIALOGBOX))
      {
        if (lpMsg->message == WM_KEYDOWN)
        {
          //-- process the key down message
          lResult = 1;
        }
      }

      // do default processing if required
      if (lResult == 0)
      {
        lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
      }

      return lResult;
    }

Затем можно прикрепить хук к элементу управления для редактирования, когда элемент управления для редактирования получает фокус следующим образом:

    //-- create an instance thunk for our hook callback
    FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
                                                    hInstance);
    //-- attach the message hook
    FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
                                 (HOOKPROC)FilterProc, 
                                  hInstance, GetCurrentThreadId());

и удаляется при редактировании элемента управления при потере фокуса следующим образом:

    //-- remove a message hook
    UnhookWindowsHookEx(MessageFilterHook);

При таком подходе каждое нажатие клавиши будет отправлено на крючок при условии, что элемент управления редактирования имеет фокус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...