2011-10-20 35 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表示這是不可能的。過去可能的情況可能是這樣,但現在已經不存在了。但我可以保證的一件事是:如果可能的話,這是一種痛苦。 –

相關問題