0

外部のJavaデスクトップアプリケーションからイベント情報とUI要素データを取得する方法はありますか?具体的には、特定のテキストボックスの値が変更されたときにログに記録し、他のいくつかの入力要素からデータを取得する必要があります。

これは、顧客向けの概念実証プロジェクト用です(マルウェアではありません;-))。

Javaアプリケーションはすでに存在しており、追加または再コンパイルすることはできません。「リスニング」アプリケーションは、.NETまたはJavaを使用して構築できます。WindowsイベントフックとJavaAccessibilityAPIに関する限られた情報を見つけましたが、主に知識が不足しているためにブロックされました。

これが簡単にできるかどうかはわかりません-考えていただければ幸いです。

4

2 に答える 2

1

このリンクを参照してください:

外部キー リスナー

precionamentos キーをリッスンできます。この同じ API 内で、monento でアクティブなウィンドウ タイトルをキャプチャして、アプリケーションが予期されていることを確認し、内部イベントをトリガーできます。

于 2013-01-30T11:35:06.627 に答える
1

私の頭に浮かんだ 1 つの解決策は、既存の Java プログラムをラップする Java プログラムを作成することです。

元のプログラムが単一の .jar で配布されているとしましょう。main次に、この jar を依存関係としてコンパイルし、クラスパスでこの jar を使用して実行し、jar の関数を呼び出す関数を含む Java クラスを作成しますmain

public class WrapMyApp {
    public static void main(String[] args) {
        com.myorg.MyApp.main(args);
    }
}

したがって、この手法を使用すると、JVM を制御でき、 への呼び出しの前後にコードを挿入できますmain

GUI から情報を取得するには、どのようなトリックを使用できますか? 運が良ければ、リフレクション API を介して GUI コンポーネントにアクセスできるかもしれません。もう 1 つの解決策は、 から始めて GUI をトラバースすることJFrameです。これは、GUI レイアウトが事前にわかっていて、十分に静的であることを意味します。例 :

    JWindow w = (JWindow) Window.getWindows()[0];
    JPanel p = (JPanel) w.getContentPane().getComponent(2);
    JTextArea t = (JTextArea) p.getComponent(5);
    String s = t.getText();

SwingExplorerなどのツールを使用して GUI レイアウトを探索し、コンポーネントが配置されている場所を見つけることができます。

これが機能しない場合は、主要なイベントをリッスンして、EventQueue にフックすることを試みることができます。

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

        public void eventDispatched(AWTEvent event) {
            // useful code here
        }
    }, AWTEvent.KEY_EVENT_MASK);

SwingUtilities.invokeLater()GUI コンポーネントにアクセスしようとするときは、コードを , 内にラップすることを忘れないでください。

于 2013-01-30T13:24:34.627 に答える