Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Горячие клавиши в Windows-приложениях на С++ Builder

В этой статье я расскажу о трёх способах реализации горячих клавиш в ваших Windows-приложениях на C++ Builder. Причём, если первые два способа работают только когда фокус установлен на окно вашего приложения, то последний позволяет реагировать на горячие клавиши независимо от наличия или отсутствия фокуса у этого окна. Итак, поехали.

Cвойство ShortCut и компонент HotKey

Первый и самый простой вариант назначить горячие клавиши — это использовать свойство ShortCut. Мы просто прописываем сочетание горячих клавиш напрямую в свойство ShortCut нужного компонента при проектировании формы или определяем сочетание, которое будет использоваться в качестве горячих клавиш, при помощи компонента HotKeys и далее присваиваем это сочетание свойству ShortCut.

Например, пусть у нас есть меню с пунктом Test, к выбору которого в качестве горячей клавиши нужно привязать сочетание Ctrl+A. Для этого достаточно при проектировании меню, в свойстве ShortCut компонента Test указать нужное сочетание (смотрите рисунок ниже).

добавление горячих клавиш через свойство ShortCut

Альтернативный вариант — поместить на форму компонет HotKey со вкладки Win32. Теперь нужное сочетание клавиш можно указать в свойстве HotKey компонента HotKey, а затем присвоить значение свойства Hotkey свойству ShortCut нужного компонета. Преимущество такого подхода заключается в том, что позволяет назначать и переназначать горячие клавиши «налету», поскольку при вводе какого-либо сочетания в поле ввода компонета HotKey, это сочетание автоматически присваивается свойству HotKey этого компонента.

Пример на картинке ниже показывает использование компонента HotKey для назначения горячих клавиш к пункту меню test в момент создания формы.

добавление горячих клавиш при помощи компонента HotKey

У описанного метода есть один серьёзный недостаток — этот метод подходит только для компонентов, имеющих свойство ShortCut (в основном это только компоненты меню). Далее мы рассмотрим, что делать, если такого свойства у компонента, которому мы хотим назначить горячие клавиши, нет.

Cвойство KeyPreview

Следующий вариант — использовать свойство KeyPreview главной формы приложения. По-умолчаниию значение этого свойства установлено в false, но если установить его в true, то любой ввод с клавиатуры будет в первую очередь поступать обработчикам главной формы, независимо от того, какой компонет находится в фокусе. В этом случае можно прописать горячие клавиши в обработчике события OnKeyDown главной формы приложения. На картинке ниже представлен пример.

добавление горячих клавиш через KeyPreview

Этот метод позволяет более гибко использовать в приложении горячие клавиши, прикрепляя их даже к тем компонентам, у которых нет свойства ShortCut. Да и вообще, этот вариант позволяет активировать при помощи горячих клавиш любые методы любых компонентов приложения или какие-то самописные функции и методы. Единственным недостатком можно считать то, что этот метод, как и предыдущий, работает только в том случае, когда окно приложения находится в фокусе. А что делать, если окно приложения находится не в фокусе? Тогда нам поможет следующий вариант.

Подписка через WinAPI

Этот вариант предполагает использование WinAPI для регистрации сочетания горячих клавиш в самой операционной системе (а не в нашей программе) и подписку на это сочетание. Таким образом окну нашей программы не обязательно находится в фокусе, поскольку клавиатурный ввод теперь анализирует не наша программа, а сама операционка, которая при обнаружении нужного сочетания просто присылает нашей программе уведомление (мессадж) о том, что это сочетание нажато.

Как это всё реализовать?

Первым делом регистрируем нужное сочетание клавиш в операционной системе при помощи функции RegisterHotKey. В качестве параметров указываем handle окна нашего приложения (Form1->Handle), идентификатор, который будет присвоен регистрируемому сочетанию, модификаторы (Alt, Ctrl, Shift) и, собственно, сама клавиша. Этот код можно поместить прямо в конструкторе формы.

Далее кидаем на форму компонент ApplicationEvents (вкладка Additional), который будет принимать и обрабатывать мессадж от операционки.

Ну и, наконец, в обработчике события OnMessage проверяем, сработало ли именно нужное нам сочетание клавиш и если да, то выполняем нужное действие. Ниже на картинке показан пример.

добавление горячих клавиш через RegisterHotKey

Вот и всё. Потом, кстати, можно эту регистрацию отменить функцией UnregisterHotKey, когда горячие клавиши больше не нужны, а то все эти мессаджи от операционки могут ваше приложение сильно замедлить.

Добавить комментарий