2011-10-20 36 views
2

如何禁用[Ubuntu] Linux机器上的OS级键盘快捷键(例如Alt-Tab,Ctrl-Alt-Left/Right等)?我正在开发一个全屏Java Swing应用程序,并且不希望用户能够任意切换程序。切换“始终在最上面”标志是不够的;用户不得被允许切换工作区,迁移焦点或任何其他类似的东西。机器必须在执行应用程序之前和之后正常运行。谷歌表示,这将需要JNI或JNA,但我正在寻找更多的手持。适用于Linux Java Swing应用程序的Kiosk模式

回答

4

尝试在应用程序中执行此操作是没有意义的,因为这些更改都需要由X11和/或窗口管理器来处理,因为这些更改会响应这些命令。假设你已经控制了平台,选择一个支持Kiosk模式的窗口管理器。然后使用窗口管理器的设置来启动应用程序并进入Kiosk模式。

可以做到这一点的窗口管理器的选项包括KDEtwm-kiosk

(如果你没有这个平台的控制,你可能不会要能够让应用程序拦截之类的东西CTRL-ALT-Backspace键反正。)

编辑:

为了回应缩小版本的问题,他愿意让ctl-alt-backspace之类的东西去,只需要包括alt-tab或其他类似的应用程序切换组合键在内的大部分键,下面的代码应该可以工作:

你应该可以通过JNI使用XLib的XGrabKeyboard方法来做到这一点。这Java/XLib JNI keypress capture tutorial应该是一个很好的起点。但是,它使用XGrabKey,它只是被动地监听密钥,并且不会阻止其他应用程序接收它们。您将改为使用XGrabKeyboard,它主动地拦截所有正常的键盘事件(如果StackOverflow问题的前提是正确的,则包含任务切换键)。

请注意,作为一种副作用,Swing中的键捕获也可能会停止工作,因为您的Swing窗口将与您在C中创建的窗口分开。因此,您可能必须使用JNI接口在需要时获得按键到您的程序。 (虽然在编写代码之前,我肯定会建议先测试它。)如果您可以使用Java AWT Native Interface获取窗口ID来获得窗口,则可以避免此问题。 (请注意,Swing是建立在AWT之上的,所以这对Swing很有用。)但是,我不知道如何做到这一点。看起来您可能能够通过从显示屏获取根窗口并从那里找到您的窗口来浏览窗口树,但这很奇怪。如果AWT NI刚刚告诉你窗口ID,那就太好了,但看起来并不像这样。

由于此警告提示Reminder: XGrabKeyboard is not a security interface,这并不能使其他程序看不到密钥,但窗口管理器似乎不会使用XQueryKeyMap,因此可能会阻止任务切换。

+0

应用程序的安装程序将具有管理员级别的身份验证,但这是我对系统的控制范围。您是否说我需要强制操作系统在启动我的Java应用程序之前使用特定的窗口管理器?这是一个设置,我可以在应用程序启动时自动切换,一旦执行终止(正常或以其他方式)时恢复?我需要超级用户权限才能做这样的事情吗?我一直认为Linux视频游戏以某种方式管理对任意配置的机器的敌意收购。也许我可以利用他们使用的任何库。 –

+0

如果非常多的Linux游戏陷阱组合像ctrl-alt-backspace和类似的,我会感到非常惊讶。他们并不试图将用户锁定在操作系统之外,只是为了避免意外切换。这是一个更容易的问题。 –

+0

一些谷歌搜索引起了对这是否可能的不同意见。此主题:http://fixunix.com/xwindows/90830-grab-keyboard-mouse-including-ctrl-alt-f1-ctrl-alt-backspace.html指出,VMWare在捕获键盘时设法抓住这些键盘输入输入并建议它以某种方式使用DRI来执行此操作。另一方面,这个xscreensaver常见问题解答:http://www.jwz.org/xscreensaver/faq.html#no-ctl-alt-bs表示这是不可能的。过去可能的情况可能是这样,但现在已经不存在了。但我可以保证的一件事是:如果可能的话,这是一种痛苦。 –

相关问题