【问题标题】:Kiosk mode for Linux Java Swing applicationLinux Java Swing 应用程序的 Kiosk 模式
【发布时间】:2011-12-11 11:30:33
【问题描述】:

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

【问题讨论】:

    标签: java c linux java-native-interface kiosk


    【解决方案1】:

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

    可以执行此操作的窗口管理器选项包括KDE 或twm-kiosk。

    (如果您无法控制平台,您的应用程序无论如何也不可能拦截诸如 ctrl-alt-backspace 之类的内容。)

    编辑:

    在回答问题的缩小版本时,他愿意让诸如 ctl-alt-backspace 之类的东西消失,只想要大多数键,包括 alt-tab 或其他类似的应用程序切换键组合,以下应该工作:

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

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

    正如此警告 Reminder: XGrabKeyboard is not a security interface 所指出的,这并不会使其他程序无法看到键,但窗口管理器似乎不会使用 XQueryKeyMap,因此它可能会阻止任务切换。

    【讨论】:

    • 应用程序的安装程序将具有管理员级别的身份验证,但这是我对系统的控制范围。您是说在启动我的 Java 应用程序之前我需要强制操作系统使用特定的窗口管理器吗?这是我可以在应用程序启动时自动切换并在执行终止(优雅或其他方式)后恢复的设置吗?我需要超级用户权限才能做这样的事情吗?我一直认为 Linux 视频游戏会以某种方式对任意配置的机器进行恶意收购。也许我可以利用他们正在使用的任何库。
    • 如果很多 Linux 游戏都陷入诸如 ctrl-alt-backspace 之类的组合,我会感到非常惊讶。他们并没有试图将用户锁定在操作系统之外,只是避免意外切换。这是一个容易得多的问题。
    • 一些谷歌搜索出现了关于这是否可能的不同意见。该线程:fixunix.com/xwindows/… 表示 VMWare 在捕获键盘输入时确实设法抓取了这些键盘输入,并建议它以某种方式使用 DRI 来执行此操作。 xscreensaver 的这个常见问题解答:另一方面,jwz.org/xscreensaver/faq.html#no-ctl-alt-bs 说这是不可能的。它可能曾经是可能的,但现在不再可能了。不过,我可以保证一件事:如果可能的话,这很痛苦。
    • 如果我放弃一些更雄心勃勃的要求怎么办?我可以忍受用户能够杀死应用程序或注销。希望在我的活动期间尽可能不方便地使用其他应用程序。如果万无一失的解决方案很重要,我会尽可能禁用 Alt-Tab、Ctrl-Alt-Right/Left 和其他任务切换快捷键。可能会在每个用户的工作空间上抛出一个空白的“始终在顶部”窗口。如果迫在眉睫,我还可以禁用非 Gnome 窗口管理器的应用程序。基本上,我想实施所有符合“更容易的问题”的对策。
    • 我已经更新了上面的答案,尽我所能回答问题的简单版本。我删除了之前在这里的评论,因为它的所有细节都已移至该答案,再加上一点。顺便说一句,感谢您的接受。
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 2018-04-26
    • 2014-10-07
    • 2014-05-21
    • 2011-08-30
    • 2015-10-11
    • 2018-06-14
    • 2013-02-19
    相关资源
    最近更新 更多