是否可以在應用程序級別而不是組件級別上通知關鍵事件?我的意思是應用程序級別沒有一個swing組件接收關鍵事件,而是讓一個特殊的類監聽系統範圍的關鍵事件。Java中的應用程序級別的關鍵事件
這可以在沒有GUI的應用中使用,或者當需要更全局的關鍵事件處理時。
是否可以在應用程序級別而不是組件級別上通知關鍵事件?我的意思是應用程序級別沒有一個swing組件接收關鍵事件,而是讓一個特殊的類監聽系統範圍的關鍵事件。Java中的應用程序級別的關鍵事件
這可以在沒有GUI的應用中使用,或者當需要更全局的關鍵事件處理時。
不知道在本機Java中是否可能:在Windows中,您必須創建一個DLL來掛鉤系統(全局)級別的關鍵事件,我想這是Unix或MacOS中的一種不同機制,所以您有接口到低級別的系統API來完成這個任務。
這個過程很難嗎?我害怕win32編程沒有經驗。 – 2009-08-17 09:52:58
信號不是一個普遍的概念,但某些信號如ctrl + c關機很普遍,如果沒有在任何地方使用。這個特定的信號可以使用關機掛鉤來收聽。調用Runtime.addShutdownHook(Thread)可以讓你知道虛擬機什麼時候關閉以及在這個事件上做些什麼。
您可以使用java.awt.Toolkit中的addAWTEventListener()方法將全局事件偵聽器添加到您的應用程序中。
當然,當你的應用程序具有焦點,這隻會工作。
因此對關鍵事件,你可以使用:
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);
hm ...那麼如果我沒有gui首先獲得焦點會發生什麼呢? – 2009-08-17 09:52:09
如果沒有gui,那麼你不能從AWT獲得KeyEvent。沒有GUI的鍵盤的唯一用戶輸入直接來自System.in流,該流接收控制檯中鍵入的字符。 如果您需要捕獲事件,即使您的應用程序沒有焦點,那麼我認爲您將需要使用JNI來訪問PhiLho建議的操作系統級別的掛鉤。 – Aaron 2009-08-17 18:13:14
你需要更具體的瞭解你要聽什麼事件。關於我能想到的唯一通用的就是關機。 – 2009-08-16 16:28:35