2009-08-16 71 views
1

是否可以在應用程序級別而不是組件級別上通知關鍵事件?我的意思是應用程序級別沒有一個swing組件接收關鍵事件,而是讓一個特殊的類監聽系統範圍的關鍵事件。Java中的應用程序級別的關鍵事件

這可以在沒有GUI的應用中使用,或者當需要更全局的關鍵事件處理時。

+0

你需要更具體的瞭解你要聽什麼事件。關於我能想到的唯一通用的就是關機。 – 2009-08-16 16:28:35

回答

0

不知道在本機Java中是否可能:在Windows中,您必須創建一個DLL來掛鉤系統(全局)級別的關鍵事件,我想這是Unix或MacOS中的一種不同機制,所以您有接口到低級別的系統API來完成這個任務。

+0

這個過程很難嗎?我害怕win32編程沒有經驗。 – 2009-08-17 09:52:58

-1

信號不是一個普遍的概念,但某些信號如ctrl + c關機很普遍,如果沒有在任何地方使用。這個特定的信號可以使用關機掛鉤來收聽。調用Runtime.addShutdownHook(Thread)可以讓你知道虛擬機什麼時候關閉以及在這個事件上做些什麼。

2

您可以使用java.awt.Toolkit中的addAWTEventListener()方法將全局事件偵聽器添加到您的應用程序中。

http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#addAWTEventListener%28java.awt.event.AWTEventListener,%20long%29

當然,當你的應用程序具有焦點,這隻會工作。

因此對關鍵事件,你可以使用:

public class MyGlobalKeyListener implements AWTEventListener { 
    public void eventDispatched(AWTEvent event) { 
     // do something here 
    } 
} 

// Then on startup register. 
AWTEventListener myGlobalKeyListener = new MyGlobalKeyListener(); 

Toolkey.getDefaultToolkit().addAWTEventListener(myGlobalKeyListener, AWTEvent.KEY_EVENT_MASK); 
+0

hm ...那麼如果我沒有gui首先獲得焦點會發生什麼呢? – 2009-08-17 09:52:09

+0

如果沒有gui,那麼你不能從AWT獲得KeyEvent。沒有GUI的鍵盤的唯一用戶輸入直接來自System.in流,該流接收控制檯中鍵入的字符。 如果您需要捕獲事件,即使您的應用程序沒有焦點,那麼我認爲您將需要使用JNI來訪問PhiLho建議的操作系統級別的掛鉤。 – Aaron 2009-08-17 18:13:14