Режим киоска для приложения Linux Java Swing

2

Как отключить быстрые клавиши на уровне OS (например, Alt-Tab, Ctrl-Alt-Left/Right и т.д.) на машине [Ubuntu] Linux? Я разрабатываю полноэкранное приложение Java Swing и не хочу, чтобы пользователь мог произвольно отключить задачу от программы. Этого недостаточно, чтобы переключить флаг "всегда сверху"; пользователям не разрешается переключаться на рабочие области, переносить фокус или любые другие подобные вещи. Машина должна нормально функционировать до и после запуска приложения. Google говорит, что для этого потребуется JNI или JNA, но я ищу немного больше рук.

Теги:
jni
kiosk

1 ответ

4
Лучший ответ

Нет смысла пытаться сделать это в своем приложении, потому что любой из этих изменений нужно будет обрабатывать X11 и/или диспетчер окон, поскольку это то, что отвечает командам. Предполагая, что у вас есть контроль над платформой, выберите диспетчер окон, который поддерживает режим киоска. Затем используйте настройки оконного менеджера, чтобы запустить приложение и войти в режим киоска.

Опции для оконных менеджеров, которые могут это сделать, включают KDE или TWM-киоск.

(И если у вас нет контроля над платформой, вы вряд ли сможете, что ваше приложение будет перехватывать такие вещи, как ctrl-alt-backspace).

Edit:

В ответ на уменьшенную версию вопроса, в котором он хочет позволить вещам, подобным ctl-alt-backspace, пойти и просто хочет большинство ключей, включая альт-табу или другие аналогичные комбинации клавиш переключения приложений, следующее: работа:

Вы можете сделать это с помощью метода XLib XGrabKeyboard через JNI. Этот Java/XLib JNI-приложение для захвата нажатия клавиши должно быть хорошей отправной точкой. Однако он использует XGrabKey, который просто пассивно слушает ключи и не мешает другим приложениям получать их. Вместо этого вы захотите использовать XGrabKeyboard, который активно мешает всем обычным событиям клавиатуры (что, если предпосылка this вопроса StackOverflow верна, включает ключи переключения задач).

Обратите внимание, что в качестве побочного эффекта захват клавиш в Swing также, вероятно, перестанет работать, потому что ваши окна Swing будут отделены от окна, которое вы создаете на C. Таким образом, вам, вероятно, придется использовать свой интерфейс JNI для при необходимости нажмите клавишу нажатия на вашу программу. (Хотя я бы определенно посоветовал сначала проверить его перед написанием кода.) Возможно, вы сможете избежать этого, если вы можете получить окно с помощью Java AWT Native Interface, чтобы получить идентификатор окна. (Обратите внимание, что Swing построен поверх AWT, так что это будет работать для Swing.) Однако я не знаю, как это сделать. Похоже, что вы можете перемещаться по дереву окон, получая окно корня из Дисплея и идя оттуда, чтобы найти свое окно, но все это странно. Было бы неплохо, если бы AWT NI просто сказал вам идентификатор окна, но он не похож на это.

Как это предупреждение Напоминание: XGrabKeyboard не является интерфейсом безопасности, это не делает невозможным просмотр другими программами ключей, но представляется вероятным, что оконные менеджеры не будут использовать XQueryKeyMap, поэтому, вероятно, это предотвратит переключение задач.

  • 0
    Установщик приложения будет иметь аутентификацию на уровне администратора, но это степень моего контроля над системой. Вы говорите, что мне нужно заставить ОС использовать определенный оконный менеджер перед запуском моего Java-приложения? Это параметр, который я могу автоматически переключать при запуске приложения и возвращать его после завершения выполнения (изящно или нет)? Нужны ли мне права суперпользователя, чтобы сделать что-то подобное? Я всегда думал, что видеоигры Linux каким-то образом управляют враждебным захватом произвольно настроенных машин. Возможно, я смогу использовать любую библиотеку, которую они используют.
  • 0
    Я был бы очень удивлен, если бы очень много Linux-игр перехватывали комбинации, такие как Ctrl-Alt-Backspace и подобные Они не пытаются заблокировать пользователя из ОС, просто избегая случайного переключения. Это гораздо более простая проблема.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню