一尘不染

Linux Java Swing应用程序的信息亭模式

linux

如何在[Ubuntu] Linux机器上禁用OS级键盘快捷键(例如Alt-Tab,Ctrl-Alt-左/右等)?我正在开发全屏Java
Swing应用程序,并且不希望用户能够任意切换程序。仅切换“ always on
top”标志始终是不够的。不允许用户切换工作区,转移焦点或任何其他此类事情。在执行应用程序之前和之后,机器必须正常运行。谷歌表示这将需要JNI或JNA,但我正在寻找更多功能。


阅读 261

收藏
2020-06-07

共1个答案

一尘不染

尝试在您的应用程序中执行此操作没有任何意义,因为X11和/或窗口管理器将需要处理所有这些更改,因为这些都是对命令的响应。假设您可以控制平台,请选择一个支持信息亭模式的窗口管理器。然后使用窗口管理器的设置启动您的应用程序并进入信息亭模式。

可以执行此操作的窗口管理器选项包括KDEtwm-
kiosk

(而且,如果您无法控制该平台,则您无论如何都无法让您的应用程序拦截ctrl-alt-backspace之类的东西。)

编辑:

为了缩小这个问题的规模,他愿意放开ctl-alt-backspace之类的东西,只想要大多数键,包括alt-
tab或其他类似的应用程序切换键组合,下面的方法应该起作用:

您应该能够通过JNI
使用XLib的XGrabKeyboard方法执行此操作。此Java
/ XLib
JNI键捕获教程
应该是一个很好的起点。但是,它使用XGrabKey只是被动地侦听密钥,并不阻止其他应用程序接收它们。您将改为使用XGrabKeyboard,它可以主动捕获所有正常的键盘事件(如果 StackOverflow问题的前提是正确的,则包括任务切换键)。

请注意,作为副作用,Swing中的键捕获也可能会停止工作,因为您的Swing窗口将与在C中创建的窗口分开。因此,您可能必须使用JNI界面来获得按键。在需要时将其添加到您的程序中。(尽管我肯定会建议您在编写代码之前先对其进行测试。)如果可以使用Java
AWT本机接口
获取窗口,则可以避免这种情况。获取窗口ID。(请注意,Swing是在AWT之上构建的,因此这将适用于Swing。)但是,我不确定如何执行此操作。看起来您可能能够通过从“显示器”获取根窗口并从那里查找窗口来导航窗口树,但这有点奇怪。如果AWT
NI只是告诉您窗口ID,那就好了,但是看起来不像那样。

正如此警告提醒:XGrabKeyboard不是安全界面上所述,这不会使其他程序看不到密钥,但是窗口管理器似乎不会使用XQueryKeyMap,因此可能会阻止任务切换。

2020-06-07