Предположим, у меня есть приложение без окон, которое имеет только значок на панели задач (Windows, Mac OS X & Linux). Я хочу, чтобы он фиксировал некоторые ключевые комбинации клавиш &, скажем, Right Control + Right Shift. После ввода правильного сочетания он что-то сделает, скажем, снимок экрана. Я могу сделать приложение без окон, значок на панели задач и захват экрана, но я не знаю, как контролировать клавиатуру глобально для комбинаций клавиш. Прошу вас посоветуйте. Любая помощь или подсказка очень ценится! Заранее спасибо!Ключ-ключ и комбинации клавиш с клавиатуры с Qt 4.6
ответ
Общесистемный захват ключей - это сложный вопрос, но общесистемная зацепка клавиш даже сложнее. Каждая ОС/GUI имеет собственное решение, по крайней мере, для захвата. Qt4 не раскрывает такую функцию, но Qt eXTension library решает проблему с ее QxtGlobalShortcut. Это хорошая обертка для:
- XGrabKey()/XUngrabKey() в X11,
- RegisterHotKey()/UnregisterHotKey() в Windows,
- RegisterEventHotKey()/UnregisterEventHotKey() в Mac OS X.
Так вы может захватить явную комбинацию клавиш, то есть конкретный ключ и модификаторы (XGrabKey() позволяет немного больше), что никакое другое приложение не получит. Ключевые последовательности, то есть последовательные комбинации клавиш, здесь не поддерживаются.
Keyboard закреплять является гораздо более мощным, поскольку он позволяет заглядывать на входные события (или даже их фильтрации). Он не только используется регистраторами клавиатуры, но и является типичной ассоциацией здесь.
Если вы в Windows, то вы можете прочитать:
- Hooks and DLLs Джозеф М. Newcomer,
- Hooks.
В X11 это намного сложнее. Есть, по крайней мере, две страницы, которые вы можете прочитать:
- X.Org Wiki - Development/Documentation/InputEventProcessing - чтобы иметь некоторый фон,
- Exploiting X11 to monitor keystrokes - чтобы понять трудности.
Был X Event Interception Extension, но он не поддерживался и в конечном итоге был удален.
Надеюсь, это может быть сделано без помощи инфраструктуры X11. В ядре Linux 2.6 есть «Интерфейс событий», известный как evdev, который можно использовать здесь. Подробности можно найти в исходном коде logkeys Linux keylogger. Это также можно сделать с помощью чего-то похожего на evdev. См. Мой проект PoC: kaos - Основная деятельность Экранный дисплей.
И у меня нет Mac, поэтому никаких дальнейших ссылок. ;)
+1 спасибо. Я не заметил вашего ответа. Я использую libqxt без успеха в Mac OS X. – Viet
Как я уже сказал, я не являюсь пользователем Mac, поэтому я не могу вам помочь. Сожалею. – przemoc
Интересно, что [Win32 Hooks] (http://msdn.microsoft.com/en-us/library/ms997537.aspx) теперь является пустой страницей с 'Content Removed'. Это моя вина? ;) Я обновляю выше ответ. Не беспокойтесь, есть [Wayback Machine] (http://www.archive.org/). 'http://web.archive.org/web/20080510093117/http://msdn.microsoft.com/en-us/library/ms997537.aspx)' - Win32 Крючки от Kyle Marsh – przemoc
На мой взгляд, вы не можете захватить или захватить ключ, так как у вас нет фокуса на вашем окне. – dzen
Так что мне нужно Крюк тогда :) – Viet
Просто любопытно. Вы ждете более тщательного ответа, чем мой?;) – przemoc