0

以下のコードは、キーボードで control+A が押されたときにテキストを出力し、システム トレイに画像を表示するテスト可能なクラスです。これはすべて、オペレーティング システムでサポートされているシステム トレイに依存します。

私の問題は、Ctrl + 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();
        }
    }       
}

}
4

2 に答える 2

2

コードが機能しない理由は、Java がキー イベントを「グローバルに」リッスンしていないためであり、メニューにフォーカスがあり、表示されている場合に限られます。

これは、純粋な Java キーロガーを作成できない理由でもあります。Java では、ウィンドウ向けのメッセージのみをキャプチャできます。

回避策は、次のオプションのいずれかを実装することです。

  • JNI/JNA/任意のネイティブ ラッパーを使用して、グローバル キー フックにアクセスします
  • 常に最前面に表示され、イベントをキャプチャするシステム トレイには表示されない、非表示のウィンドウを使用します。これは魅力的に機能しないか、ユーザーを悩ませる可能性があるため、これを使用することはお勧めしません。

一番上のアプローチは難しいものではありませんが、ネイティブ アクセスを使用する必要があるため、アプリケーションはプラットフォーム固有になります。

幸運を!

于 2013-08-23T22:29:00.333 に答える