2

如何在 [Ubuntu] Linux 机器上禁用操作系统级别的键盘快捷键(例如 Alt-Tab、Ctrl-Alt-Left/Right 等)?我正在开发一个全屏 Java Swing 应用程序,并且不希望用户能够任意切换任务离开程序。切换“始终在顶部”标志是不够的;不得允许用户切换工作区、迁移焦点或任何其他此类事情。机器必须在应用程序执行前后正常运行。谷歌表示这将需要 JNI 或 JNA,但我正在寻找更多的支持。

4

1 回答 1

4

尝试在您的应用程序中执行此操作是没有意义的,因为这些更改中的任何一个都需要由 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 Native Interface获取窗口,则可以避免这种情况获取窗口 ID。(请注意,Swing 构建在 AWT 之上,因此这适用于 Swing。)但是,我不确定如何执行此操作。看起来您可以通过从显示器获取根窗口并从那里找到您的窗口来导航窗口树,但这有点奇怪。如果 AWT NI 只是告诉您窗口 ID,那就太好了,但它看起来不像那样做。

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

于 2011-10-20T04:30:07.450 回答