2013-08-23 21 views
0

下面的代碼是一個可測試的類,它應該在控制鍵+ A被按下時在鍵盤上打印出一些文本,並且還會在系統托盤中顯示一個圖像。這完全取決於您的操作系統支持的系統托盤。MenuShortcut KeyEvent不工作

我的問題是,當我按下control + A時,文本沒有被打印出來,只有當我按下系統托盤中的項目時纔會打印文本。

/** 
* 
* @author Tyluur 
* @since Aug 23, 2013 
*/ 
public class Testable { 

public static void main(String... args) { 
    registerTrayItems(); 
} 

private static void registerTrayItems() { 
    if (SystemTray.isSupported()) { 
     SystemTray tray = SystemTray.getSystemTray(); 
     TrayIcon icon = null; 
     MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A); 
     MenuItem menuItem = new MenuItem("Toggle", shortcut); 
     menuItem.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.err.println("The action has been called!"); 
      } 
     }); 
     PopupMenu popup = new PopupMenu(); 
     popup.add(menuItem); 
     try { 
      icon = new TrayIcon(new ImageIcon(new URL("http://i.imgur.com/xQoz2TN.png")).getImage(), "Typer", popup); 
      tray.add(icon); 
     } catch (MalformedURLException | AWTException e) { 
      e.printStackTrace(); 
     } 
    }  
} 

} 
+0

''我做錯了什麼?'' - 一個,不發表[sscce](http://sscce.org)。請張貼我們可以測試,修改和運行的代碼。 –

+0

它已更新爲SSCCE。 – Tyluur

+1

地獄,你爲什麼要問同樣的問題兩次?我們在你之前的問題中告訴過你,Java不會以這種方式工作,KeyListeners不適用於沒有焦點的應用程序,而且答案也不會令人驚訝,它仍然是一樣的! –

回答

2

你的代碼不工作的原因是因爲Java不是'全局'監聽你的關鍵事件,而只是當菜單有你的焦點並顯示時。

這也是爲什麼沒有可能編寫純Java鍵盤記錄器的原因。 Java僅允許您捕獲窗口定向的消息。

一種解決方法是實施這些選項之一:

  • 使用JNI/JNA /不管本地包裝進入全球主要的掛鉤
  • 使用透明的窗口,始終是在頂部和未顯示捕獲事件的系統托盤。我不會建議使用這個,因爲它可能不是像魅力一樣工作,或者會讓你的用戶惱火。

頂部的做法是不是一個很難,但會要求您使用本機訪問,併爲此申請成爲特定於平臺。

祝你好運!

0

從API,它看起來像你應該嘗試)這個構造的菜單項(

MenuShortcut shortcut = new MenuShortcut(KeyEvent.VK_A, false); 

爲默認的是要求Shift鍵也被按下。

+0

我將VK_A更改爲VK_F12,因爲VK_A是許多程序常用的熱鍵,並添加了錯誤的參數,但沒有任何區別。 – Tyluur

+0

現在運行你的代碼,我同意@BartPelle。但是這也應該有固定需要換檔的鑰匙。 – n0741337