如何在[Ubuntu] Linux机器上禁用OS级键盘快捷键(例如Alt-Tab,Ctrl-Alt-左/右等)?我正在开发全屏Java Swing应用程序,并且不希望用户能够任意切换程序。仅切换“ always on top”标志始终是不够的。不允许用户切换工作区,转移焦点或任何其他此类事情。在执行应用程序之前和之后,机器必须正常运行。谷歌表示这将需要JNI或JNA,但我正在寻找更多功能。
尝试在您的应用程序中执行此操作没有任何意义,因为X11和/或窗口管理器将需要处理所有这些更改,因为这些都是对命令的响应。假设您可以控制平台,请选择一个支持信息亭模式的窗口管理器。然后使用窗口管理器的设置启动您的应用程序并进入信息亭模式。
可以执行此操作的窗口管理器选项包括KDE或twm- 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,因此可能会阻止任务切换。