問題タブ [awtrobot]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - アプリケーションの 2 つの異なるバージョン間の違いを文書化するツール
Java プログラムの 2 つの異なるバージョン間の視覚的な違いを文書化する必要があります。これには、古いバージョンの要素をクリックしてから、新しいバージョンの同じ要素をクリックし、2 つの要素が異なる情報を表示するすべてのインスタンスのスクリーン ショットを撮り、バグ レポートを作成することが含まれます。
これを自動化できるツールはありますか?
これまでに試したことは次のとおりですが、他のアイデアも受け入れています。
両方の Java プログラムを並べて配置し、AutoHotkey を使用してマウス クリックを右に 960 ピクセル複製しようとしましたが、動作がおかしくなり、おかしな動作を無視しても機能しないことがわかりました。
また、Javaロボットを使用してみました。新しいバージョンのアプリではマウス クリックが 960 ピクセル右に複製されますが、ロボットでさえ他の Java ウィンドウをクリックできませんでした。(注: ロボットは Windows デスクトップや他のプログラムをクリックできましたが、他の Java プログラムではクリックできませんでした。)
java - java.awt.Robot: マウス/キーボード イベントを特定のウィンドウに送信する方法は? クロスプラットフォームをサポートしていますか?
この質問からJava Swingでは、ウィンドウへのWin32ウィンドウハンドル(hwnd)参照をどのように取得しますか? window32 ハンドルを取得できるようです。java.awt.Robot がマウス/キーボード イベントをそのウィンドウ ハンドルに送信することは可能でしょうか?
ロボット経由でキーを送信しているときに、ウィンドウが最小化されると、開いている他のバックグラウンドの無関係なウィンドウに入力を開始することがあります。ロボットがキーとマウスイベントを対象の特定のウィンドウに送信できるようにすることで、これを防止したいと考えています。
Mac と Linux で同じ取引を達成することは可能でしょうか? それぞれの特定のウィンドウ ハンドルにロボット イベントを送信できますか?
java - Javaロボットでクリックするために、さまざまな画面サイズでオブジェクト座標をどのように見つけますか?
マウスの移動に正しい座標を見つけたり、与えたり、Java Robot でクリックしたりするのに問題があります - (テストプロジェクトの一部) 詳しく説明するには: 画面上の (100,100) にあるオブジェクトをクリックする必要があります。 axb。しかし、他の画面解像度のために同じコードを動的に再利用する必要があります-ここでは、新しい画面の座標を動的に提供する必要があります..
java - 画面内の Java クライアント
バックグラウンドで実行される Java プログラムで Java クライアントが開いているかどうかを知る必要があります。Java では、同じ仮想マシンで実行されていない他のウィンドウを表示できません。追跡したいJavaクライアントを開くJavaプログラムを作成するとうまくいくと思いますが、うまくいきませんでした(たくさん試しました)。私の他のオプションは、Java ロボットを使用して画面のスクリーンショットを撮り、探しているクライアントのピクセルと一致するまでピクセル情報の検索を繰り返すことです。
クライアントは私が直接操作してはならないプログラムであり、私はそれを書きませんでした。簡単にするために、クライアントが赤と緑の間で色を切り替える領域を持っているとしましょう。赤は問題を意味し、緑は問題がないことを意味します。
バックグラウンドで実行されているプログラムは、クライアントをトリガー メカニズムとして使用します。つまり、クライアントが赤を示している場合です。私は何かをするべきではなく、緑色を示している場合はそうすべきです (したがって、クライアントの特定の場所の色が赤かどうかを確認するだけで済みます。
比較:
ロボット:
-実装は簡単ですか?
- 私がユーザーの情報を盗んでいないという確信をユーザーに与えます。
同じ VM で両方のプログラムを
起動
し
ます
。再び見つけるために。
悪い例:
ロボット:
- 反復には時間がかかる場合があります -
javaclient が移動するたびに反復する必要があります。
同じ VM で両方のプログラムを開始します。
-プログラムは、より多くの構成を必要とし、他の「もの」をインストールする必要があります(簡単で高速に使用できるものが必要です)
効率やその他のオプションについて気軽にコメントしたり、これら 2 つのオプションの断片を教えてください。
ありがとうございます (可能性のあるユーザーは Windows 以外の OS を実行している可能性があるため、C/C++ の代わりに Java を試し続けることにしました)
java - JavaRobotクラスを使用します。プログラムの実行を停止する方法は?
私は、単純なタスクの簡単な回避策として、JavaでRobotクラスを何度も使用しました。実行の停止は常に問題です(テスト中に何度も実行する必要があります)。私が欲しいのは、キー/キーの組み合わせをリッスンし、プログラムを停止するKeyListenerです。私の簡単な読みから、フレームなどに焦点が合っていないと、キーリスナーを埋め込むことができないようです。私にとって、フォーカスとは最前線のウィンドウを意味します。これは間違った定義ですか?これが正しい定義である場合、ロボットを持って這い回っているため、ウィンドウの焦点を合わせることができません。どうすればこの問題を解決できますか?
これを入力しているときに、プログラムでウィンドウにフォーカスを合わせ、キー押下をテストしてから、プログラムでウィンドウのフォーカスを外して続行するという、理想的ではないソリューションを思いつきました。これは可能ですか?もっと良い方法はありますか?
java - Java BufferedImage と Robot をメモリ管理の理想的な方法で使用するには?
オブジェクト指向プログラミング初心者です。画面のさまざまなサイズの長方形をさまざまな間隔でキャプチャする静的メソッドを使用してクラスを作成しました。キャプチャは、静的 Robot インスタンスを使用して静的 BufferedImage に保存されます。
データに対して一部の操作が実行されます (イメージを bmp ファイルに書き込む場合もある)。次のキャプチャでは、前のキャプチャの画像データは必要ありません。
bufferedImage には画面解像度の最大サイズまでの可変サイズのデータが含まれるため、アプリケーションが使用を開始する前にそのように宣言する必要がありますか?
これにより、画像を繰り返しキャプチャするときに、リークや非効率性なしに再利用可能なチャンクがメモリに割り当てられますか? それとも、createScreenCapture メソッドを使用するたびにメモリがいっぱいになり、myStaticBufferedImage に新しいポインタを割り当てるだけですか?
このアプリは、CPU を集中的に使用するソフトウェアと一緒に OSX Lion で実行しています。メモリ管理のベストプラクティスは何ですか? ありがとう!
java - スクリーン キャプチャを繰り返してメモリを節約するために Robot クラスをオーバーライドする必要がありますか (できますか?)、それとも GC で十分ですか?
EDIT #2 - これは過度の最適化である可能性があり、問題が発生するまで Robot クラスをそのまま使用しようとしましたが、FWIW:
私は、短いCPUスパイク/過負荷のために動作を停止してはならないオーディオソフトウェアを含む、非常にCPUとメモリを集中的に使用するソフトウェアと一緒に実行されるアプリケーション(厳密にはOSX Lion用)を設計しています。ほとんどのオーディオ ソフトウェアと同様に、メモリは常に読み書きされています。
createScreenCapture
これは非常に軽量なアプリケーションです。主な目的は、Robot クラスのメソッドを使用して、最大数時間の間、毎分数回のスクリーン キャプチャを取得することです。
後続の各スクリーン キャプチャでは、前のスクリーン キャプチャは必要ありません。Robot のソース コードを見ると、呼び出されるBufferedImage
たびに新しいものが作成されているように見えますcreateScreenCapture()
。これは、前のものがガベージ コレクションのために残されていることを意味しますね。
私はJavaとガベージコレクターが初めてです。これらの古いキャプチャを管理/削除する GC の必要性によって引き起こされる CPU スパイクが心配です。理想的には、イメージが画面から直接移動して、毎回メモリ内の同じ領域を上書きでき、アプリケーションのメモリ フットプリントは、GC が過度に機能しなくてもかなり一定に保たれます。
createScreenCapture()
同じ静的 BufferedImage を使用するように、Robot クラスを拡張してオーバーライドすることをお勧めしますか? これが機能する場合、ロボットがキャプチャごとに新しいメモリを割り当てる現在の方法では、誰にとってもメリットがないと思います。
ありがとう。
EDIT #1 - hereから取得した関連するロボットのソース コードを以下に示します。毎回新しい BufferedImage が作成されるだけでなく、同じ大きさの int[]、DataBufferInt、および WritableRaster も作成されるようです。さらに、 peer.getRGBPixels() によって作成されるオーバーヘッドはすべて、グラフィックドライバーに接続しているようですが、これに関するソースや情報が見つかりません。同じメモリを再利用しないのはもったいないと思うのは間違っていますか? 静的ポインターを使用しても何も解決しないことは明らかです。BufferedImage は、独自の set メソッドを使用して上書きする必要があります。$$$ でマークされた、このためのアプローチに関する独自のコメントを追加しました。理論的には、アプリケーションの GC アクションを大幅に節約できますが、心配する価値はありますか? Java とプロファイリングについて詳しく知っていれば、すぐにすべてを試してみることができたでしょう。
java - awtrobot が正しくない色を読み取る
画面から色を読み取り、マウスとキーボードの操作によるユーザー入力をシミュレートする、プラットフォームに依存しない方法を探しています。以前は を使用していましたが、この質問java.awt.robot
に記載されているように、過去 2 年間に OSX で正しくない色が報告されるようになりました (他のオペレーティング システムでは正確な色が得られるようです) 。
このバグの回避策、またはこの機能を提供する他のライブラリ/言語を探しています。
以下の非常に単純なコードを使用すると、問題を実証できます。
0x000000
、、 などの一部の色は正しいように見えますが0xffffff
、 (0x0000ff
ではなく)として報告される0xff0000
などの他の色は正しくありません。ほとんどの色は、少なくともわずかにずれています。0x00ff00
ff22ff00
ff00ff00
java - Java Swing:ロボットのキーボード入力を特定のJFrameウィンドウに送信できますか?
新しい JFrame ウィンドウを生成するサードパーティの Java ライブラリを使用しています。その特定のウィンドウが表示されたときにクリックとキーボード入力を java.awt.Robot に送信させるにはどうすればよいですか? 別のスレッドで実行して、ロボットが特定の JFrame ウィンドウに入力を送信している間にメイン アプリケーションで他のアクティビティを実行できるようにします。
このJFrameウィンドウを生成するプロセスへのAPIアクセスがないことに注意してください。
現在、その JFrame ウィンドウが最小化または閉じられている場合、ロボットは現在表示されている JFrame ウィンドウに入力を送信し続けます。
java - Java での 3D 一人称世界のマウスの動きの検出
私はJavaで一人称ゲームに取り組んでおり、3Dの動きを働かせようとしています。
私の問題は、マウスの動きをキャプチャしたいのに、マウスをウィンドウ内に保持したいということです。マウスの動きをキャプチャした後、Robot.moveMouse(x,y) を使用して、移動後にマウスをウィンドウの中央に配置することが、マウスをウィンドウ内に保持する最善の方法であることがわかりました。これは正常に動作しますが、ロボットからの動きがウィンドウ内のイベントをトリガーし、それが通常のイベントとして解釈されるため、ワールド内でキャラクターが動きます。
中央に来るまで状態を維持し、動きを無視するさまざまなスキームを試しましたが、それらはすべて扱いにくいようで、どのイベントがユーザーとロボットによって制御されているかを完全に検出しません。
マウスの動きがロボットからのものであることを検出する簡単な方法はありますか?
私が見落としている問題を解決する簡単な方法はありますか?