2012-01-15 4 views
2

起動時にプログラムを起動するJavaプログラムがあります。これは任意の実行可能ファイルです。問題は、Javaアプリケーションが実行中のアプリケーションに複数の入力をフォーカスしているときに(アプリケーションがキーボード入力/出力を実行する) 誰かがJavaからそのような呼び出しを直接行って、どのプログラムがフォーカスされているのかを知ることはできないと教えてくれました。だから私は、目的のアプリケーションがフォーカスされているかどうかを確認することはできません。JavaはどのOSプロセスが焦点を当てているかを確認します(つまりFirefox)

if(processName == launchedExeName) // Do code 

よう は、私は私のJavaプロジェクトで実装することができます任意のツールやライブラリはありますか?

おかげで、

Sidar

+0

ハックとして、AutoIt3のようなものを呼び出すことができます。これにはすでにかなり便利な機能があります(http://www.autoitscript.com/autoit3/docs/functions/WinActive.htm)。 – millimoose

+0

しかし、Javaからどのように呼び出されますか? – Sidar

+0

AutoItでは、スクリプトをラップする.exeファイルを作成できます。[Runtime.exec'](http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime)を使用して実行できます。 html#exec(java.lang.String))。スクリプトファイルを生成して実行することもできます。 (あまりにも漠然として申し訳ありませんが、WindowsのJava開発環境をセットアップして実用的な例を作りません) – millimoose

答えて

2

あなたは、いくつかのネイティブの呼び出しなしでJavaから直接それを行うことはできません。いくつかの図書館はあなたのためにすでにそれをしているかもしれませんが、私は気づいていません。だから、自分で書く必要があります - それは明らかに完全にOSに依存しています。

Windowsの場合、比較的シンプルです(そしてafmaにはwin32 API用のJNIラッパーがありますので、あなたはそれを自分で行う必要はありません)。ここで(簡単にするためにエラーチェックなし)基本的なバージョンがあります:

HWND hForeground = GetForegroundWindow(); 
DWORD pid; 
GetWindowThreadProcessId(hForeground, &pid); 
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid); 

現在のプロセスへのハンドルを持って、あなたがそれでやりたいことができます。あなたは、プロセスのパスをしたい場合は、このような何かを行くだろう:

DWORD size = MAX_PATH; 
TCHAR pathName[MAX_PATH]; 
QueryFullProcessImageName(hProc, /*win32 path format*/ 0, pathName, &size); 

トリビアルが本当に(あなたがイベントを受信したい場合は、それはしかし、より複雑な良いビットを取得したときに、フォアグラウンドの変更)、単にエラー処理が吹きますいつものようにコードアップ。

私が言ったように、JavaのいくつかのWin32ラッパーについて読んでいるので、JNI/JNAのものを自分で書く必要はありません。 * nixについてはここでは考えません。

+0

jni/jnaラッパーを使用する以外の方法はありません。 ありがとうございました! – Sidar

+0

JNIWrapperライブラリには、Windows APIへの一連のバインディング(http://www.teamdev.com/jniwrapper/winpack/)が含まれています。 (含まれていない場合は* nix用のラッパーを作成する作業を保存するかもしれませんが、適度なライセンス料がかかります) – millimoose

+0

Nooooes、それは無料です。 (それは価値がありません、締め切りは金曜日の予定です) しかし、とにかく感謝し続けています。 – Sidar

関連する問題