如何禁用[Ubuntu] Linux机器上的操作系统级键盘快捷键(例如Alt-Tab,Ctrl-Alt-Left / Right等)? 我正在开发一个全屏的Java Swing应用程序,并且不希望用户能够任意切换程序。 切换“永远在上”标志是不够的, 用户不得被允许切换工作区,迁移焦点或任何其他类似的东西。 在执行应用程序之前和之后,机器必须正常工作。 谷歌说,这将需要JNI或JNA,但我正在寻找更多的手持。
在应用程序中尝试这样做是没有意义的,因为这些更改都需要由X11和/或窗口管理器来处理,因为这些是对命令的响应。 假设你已经控制了平台,选择一个支持Kiosk模式的窗口管理器。 然后使用窗口管理器的设置来启动应用程序并进入信息亭模式。
可以做到这一点的窗口管理器的选项包括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 Native Interface来获得窗口ID,那么你也许可以避免这种情况。 (请注意,Swing是建立在AWT之上的,所以这对Swing是有效的。)但是,我不确定如何做到这一点。 它看起来像你可能能够浏览窗口树从显示从根本窗口,并从那里找到你的窗口,但它是所有的奇怪。 如果AWT NI只是告诉你窗口ID,那就太好了,但看起来并不像这样。
作为这个警告提醒:XGrabKeyboard不是一个安全接口的注释,这并不能使其他程序看不到密钥,但是窗口管理器似乎很可能不会使用XQueryKeyMap,因此很可能会阻止任务切换。