28 февраля 2016 г. 9:45

Qt

HotKey, linux, QGlobalShortcut, Qt, Windows

В процессе изучения вопросов с глобальными хоткеями для Linux и Windows я написал свой велосипед для быстрой регистрации хоткеев. Получившаяся библиотека называется QGlobalShortcut и выложена на GitHub под лицензией LGPLv2. Библиотека поддерживает платформы Windows и Linux/Unix (которые используют X11)

Логика работы класса QGlobalShortcut, который предоставляется данной библиотекой, похожа на логику работы класса QShortcut, хотя явно и не дотягивает до данного класса по ряду параметров, но главное, что выполняет свою основную функцию. А именно, зарегистрировать глобальный HotKey и выслать сигнал о его активации.

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

28 февраля 2016 г. 9:17

Qt

Ubuntu, HotKey, linux, Qt, XCB, XLib

Работа с глобальными хоткеями в Windows является более тривиальной задачей, чем в Linux, поскольку в WinAPI имеются для этого подготовленные методы, которые не требуют большого количества кода. А также каждому хоткею устанавливается в соответствие ID , по которому данный хоткей можно удалить.

В Linux/Unix , которые используют графический сервер X11, применительно к Qt необходимо использовать функции для регистрации/разрегистрации хоткеев из библиотеки XLib, но обрабатывать приходится получаемые значения с помощью функционала библиотеки XCB, которая разрабатывается как аналог библиотеки XLib , но является более низкоуровневой и написана на языке программирования Си. Как и в случае с Windows, для обработки глобальных хоткеев в Qt 5.5 используется метод nativeEventFilter. Предлагаю сделать отдельный класс, наследованный от QAbstractNativeEventFilter для обработки хоткеев и установить данный фильтр на всё приложение.

Для установки хоткеев будут использоваться функции XKeysymToKeycode (для получения кода клавиши из последовательности KeySym) и XGrabKey (для установки хоткея).

Для разрегистрации хоткея будет использоваться функция XUngrabKey .

Структура проекта

  • GlobalHotkeyLinux.pro - профайл проекта;
  • mainwindow.h - заголовочный файл главного окна приложения;
  • mainwindow.cpp - файл исходных кодов главного окна приложения;
  • mainwindow.ui - файл формы главного окна приложения;
  • main.cpp - основной файл исходных кодов;
  • nativeeventfilter.h - заголовочный файл фильтра событий хоткеев;
  • nativeeventfilter.cpp - файл исходных кодов фильтра событий хоткеев.
24 февраля 2016 г. 11:56

Xlib

HotKey, linux, X11, XGrabKey

Синтаксис

XGrabKey(display, keycode, modifiers, grab_window, owner_events, pointer_mode, keyboard_mode)
      Display *    display;
      int          keycode;
      unsigned int modifiers;
      Window       grab_window;
      Bool         owner_events;
      int          pointer_mode, keyboard_mode;

Аргументы

display	        // Указывает соединение с X Сервером
keycode	        // Указывает код клавиши (KeyCode) или любой код (AnyKey)
modifiers       // Указывает установку конкретных масок модификаторов 
                // или использование любых модификаторов (AnyModifier). 
                // Маска является поразрядным ИЛИ для проверки битов маски.
grab_window     // Указывает захватываемое окно
owner_events    // Указывает значение Boolean, которое указывает на события клавиатуры, 
                // будут ли представлены как обычно.
pointer_mode    // Описывает дальнейший способ обработки событий указателя мыши.
                // Вы можете передавать GrabModeSync или GrabModeAsync.
keyboard_mode	// Описывает дальнейший способ обработки событий клавиатуры. 
                // Вы можете передавать GrabModeSync or GrabModeAsync.
23 февраля 2016 г. 12:00

Xlib

HotKey, linux, X11, XUngrabKey

Синтаксис

XUngrabKey(display, keycode, modifiers, grab_window)
      Display *     display;
      int           keycode;
      unsigned int  modifiers;
      Window        grab_window;

Аргументы

display	      // Описывает соединение с X Сервером
keycode	      // Описывает код клавиши (KeyCode) или любой код (AnyKey)
modifiers     // Указывает установку конкретных масок модификаторов 
              // или использование любых модификаторов (AnyModifier). 
              // Маска является поразрядным ИЛИ для проверки битов маски.
grab_window   // Указывает захватываемое окно
8 января 2016 г. 10:53

Qt

HotKey, QKeySequence, Qt, RegisterHotKey, WinAPI, горячие клавиши

QKeySequence сильно отличается от последовательности горячих клавиш в WinAPI. QKeySequence фактически является строкой, в которой разделителем горячих клавиш являются знак "+" , а также последовательность ", " в случае, если последовательностей несколько. Тогда, как в WinAPI имеются модификаторы Alt, Ctrl, Shift, которые представлены беззнаковым целочисленным типом, и горячей клавишей, которая представлена кодом клавиатуры.

Разберём вариант, когда имеется одна последовательность в QKeySequence и её необходимо зарегистрировать в качестве глобальной горячей клавиши в WinAPI. Для этого условимся, что QKeySequence в качестве в качестве модификатора будет иметь лишь клавиши Ctrl, Alt, Shift и в качестве горячей клавиши одну из букв английского алфавита.

Далее для разбора QKeySequence напишем две функции:

  • unsigned int winKeyMod(QKeySequence) - которая будет возвращать целочисленную комбинацию модификаторов;
  • char winHotKey(QKetSequence) - которая будет возвращать код горячей клавиши.

Модификаторы Alt, Ctrl и Shift в битовом варианте имеют значения 0b00000001, 0b00000010 и 0b00000100 соответственно, поэтому логическое ИЛИ либо сложение данных чисел даст необходимое число комбинации. Следовательно необходимо в методе winKeyMod, выделить модификаторы из последовательности и в случае их наличия прибавить к числу модификатора, которое вернёт данный метод.

3 января 2016 г. 10:35

Qt

Qt, HotKey, RegisterHotKey, UnregisterHotKey, WinAPI, горячие клавиши

Для работы с глобальными HotKey в Qt 5 присутствует виртуальный метод nativeEvent . Данный метод заменил методы winEvent , x11Event , macEvent из Qt 4.8.

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

RegisterHotKey

В данном примере разберём вариант работы с WinAPI . Для этого воспользуемся функцией RegisterHotKey.

BOOL WINAPI RegisterHotKey(
  _In_opt_ HWND hWnd,
  _In_     int  id,
  _In_     UINT fsModifiers,
  _In_     UINT vk
);
Ищу работу?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

СВ
23 октября 2019 г. 1:00
Семен Волох

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:70баллов,
  • Очки рейтинга1
SS
22 октября 2019 г. 14:31
Samantha Smith

Qt - Тест 001. Сигналы и слоты

  • Результат:52баллов,
  • Очки рейтинга-4
МБ
21 октября 2019 г. 1:25
Михаил Булатов

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
Последние комментарии
17 октября 2019 г. 2:17
Евгений Легоцкой

Используем, там где требуется :)
MP
17 октября 2019 г. 2:15
Mikhail Petrov

Совет: подключайте ресурсы динамически. Используйте Resource Compiler: https://doc.qt.io/qt-5/rcc.html
16 октября 2019 г. 6:45
Евгений Легоцкой

Если это не чистой воды спам, а по делу, то без проблем. Но в таком случае лучше создавайте отдельный вопрос на форуме . При создании вопроса есть поле, в котором можно указать статью…
КК
16 октября 2019 г. 6:39
Кирилл Кирилыч

А тут можно ссылки на сторонний ресурс показывать? Нашёл на habr похожую статью, только там чуток отличается код и про локальный сервер написано, нужно чтоб кто то понимающий посмотрел и своё …
Сейчас обсуждают на форуме
23 октября 2019 г. 4:06
Евгений Легоцкой

Ну если после обновления начало появляться, то тогда откатить драйвера. А вообще, если это жить не мешает и код работает как и раньше, то просто проигнорировать эти сообщения.
22 октября 2019 г. 2:42
Pavel K.

Всем привет , Пытаюсь реализовать класс для работы с блютуз (Bluetooth Handler) для мобилки , с использование QBluetoothDeviceInfo и QBluetoothDeviceDiscoveryAgent . Может у кого е…
22 октября 2019 г. 2:16
Pavel K.

попробуй сделать через свой собственный компонет , те возьми контрол Component, например , переорпедели как свой , в нем что нить типо проперти type : disk1, disk2 (сделай метод в структуре …
Е
22 октября 2019 г. 0:03
Евгений_Канусовский@1981

Этот алгоритм предназначен для того чтобы исключить из обработки строки содержащие буквенные символы. Если Вам не трудно опишите пожалуйста как бы Вы написали этот алгоритм, желательно в коде?
MP
21 октября 2019 г. 7:03
Mikhail Petrov

Зависит от вашей задачи. Можете обратить внимание на этот пример: https://doc.qt.io/qt-5/qtqml-referenceexamples-properties-example.html QQmlListProperty используется мною достаточно ч…
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB