Kiosk模式下的Linux Java Swing应用程序



如何在[Ubuntu] Linux机器上禁用操作系统级别的键盘快捷键(例如Alt-Tab, Ctrl-Alt-Left/Right等)?我正在开发一个全屏Java Swing应用程序,不希望用户能够从程序任意切换任务。仅仅切换"永远在顶部"的标志是不够的;不允许用户切换工作空间、转移焦点或任何其他类似的事情。在执行应用程序之前和之后,机器必须正常工作。谷歌说这将需要JNI或JNA,但我正在寻找更多的手把手

在应用程序中尝试这样做是没有意义的,因为任何这些更改都需要由X11和/或窗口管理器处理,因为它们是响应命令的。假设您控制了平台,请选择支持kiosk模式的窗口管理器。然后使用窗口管理器的设置来启动应用程序并进入kiosk模式。

窗口管理器的选项包括KDE或twm-kiosk。

(如果你不能控制平台,你不可能让你的应用程序拦截ctrl-alt-backspace之类的东西。)

编辑:

回答这个问题的缩小版,他愿意让像ctrl -alt-backspace这样的东西消失,只是想要大部分的键,包括alt-tab或其他类似的应用程序切换键组合,下面应该工作:

您应该能够通过JNI使用XLib的XGrabKeyboard方法来做到这一点。这个Java/XLib JNI按键捕捉教程应该是一个很好的起点。然而,它使用XGrabKey,它只是被动地监听密钥,并不阻止其他应用程序接收它们。相反,你会想要使用XGrabKeyboard,它会主动地阻止所有正常的键盘事件(如果这个StackOverflow问题的前提是正确的,其中包括任务切换键)。

请注意,作为一个副作用,Swing中的键捕获也可能停止工作,因为您的Swing窗口将与您在c中创建的窗口分开。因此,您可能必须在需要时使用JNI接口来获取对程序的按键。(尽管我绝对建议在编写代码之前先进行测试。)如果可以使用Java AWT本机接口获取窗口ID,则可以避免这种情况。(注意,Swing是构建在AWT之上的,所以这对Swing也适用。)然而,我不知道如何做到这一点。看起来你可以通过从Display中获取根窗口来导航窗口树然后从那里找到你的窗口,但这很奇怪。如果AWT NI只告诉你窗口ID就好了,但是它看起来不像那样做。

作为这个警告提醒:XGrabKeyboard不是一个安全接口说明,这并不使它不可能为其他程序看到的键,但似乎很可能窗口管理器不会使用XQueryKeyMap,所以它很可能会阻止任务切换。

最新更新