Как отключить сочетания клавиш на уровне ОС (например, Alt-Tab, Ctrl-Alt-Влево/Вправо и т. д.) на компьютере [Ubuntu] с Linux? Я разрабатываю полноэкранное приложение Java Swing и не хочу, чтобы пользователь мог произвольно переключаться между задачами и программой. Недостаточно переключить флаг «всегда сверху»; пользователям не должно быть разрешено переключать рабочие области, перемещать фокус или делать любые другие подобные вещи. Машина должна нормально работать до и после выполнения приложения. Google говорит, что для этого потребуется JNI или JNA, но я ищу немного больше поддержки.
Режим киоска для приложения Linux Java Swing
Ответы (1)
Нет смысла пытаться сделать это в вашем приложении, потому что любое из этих изменений должно быть обработано X11 и/или оконным менеджером, поскольку именно они отвечают на команды. Предполагая, что у вас есть контроль над платформой, выберите оконный менеджер, который поддерживает режим киоска. Затем используйте настройки оконного менеджера, чтобы запустить приложение и войти в режим киоска.
Варианты оконных менеджеров, которые могут это сделать, включают KDE или twm-kiosk.
(И если у вас нет контроля над платформой, вы вряд ли сможете заставить свое приложение перехватывать такие вещи, как ctrl-alt-backspace.)
Редактировать:
В ответ на уменьшенную версию вопроса, в котором он готов оставить такие вещи, как ctl-alt-backspace, и просто хочет, чтобы большинство клавиш, включая alt-tab или другие подобные комбинации клавиш для переключения приложений, следующее должно работать:
Вы должны иметь возможность сделать это с помощью метода XLib XGrabKeyboard через JNI. Это руководство по захвату нажатия клавиш Java/XLib JNI должно стать хорошей отправной точкой. . Однако он использует XGrabKey, который просто пассивно прослушивает ключи и не препятствует их получению другими приложениями. Вместо этого вы захотите использовать XGrabKeyboard, который активно ловит все обычные события клавиатуры (которые, если предпосылка этот вопрос StackOverflow правильный, включая ключи переключения задач).
Обратите внимание, что в качестве побочного эффекта захват клавиш в Swing также, вероятно, перестанет работать, потому что ваши окна Swing будут отделены от окна, которое вы создаете в C. Таким образом, вам, вероятно, придется использовать свой интерфейс JNI для получения нажатий клавиш к вашей программе, когда это необходимо. (Хотя я бы определенно посоветовал сначала протестировать его, прежде чем писать код.) Возможно, вы сможете избежать этого, если сможете получить окно, используя Собственный интерфейс Java AWT, чтобы получить идентификатор окна. (Обратите внимание, что Swing построен поверх AWT, так что это будет работать для Swing.) Однако я не уверен, как это сделать. Похоже, вы могли бы перемещаться по дереву окон, получая корневое окно с дисплея и переходя оттуда, чтобы найти свое окно, но все это довольно странно. Было бы неплохо, если бы AWT NI просто сообщал вам идентификатор окна, но не похоже, что он это делает.
Как это предупреждение Напоминание: XGrabKeyboard не является интерфейсом безопасности отмечает, что это не мешает другим программам видеть ключи, но кажется вероятным, что оконные менеджеры не будут использовать XQueryKeyMap, поэтому это, вероятно, предотвратит переключение задач.