Java での OS レベルのウィンドウ イベントの追跡
-
03-07-2019 - |
質問
ユーザーがマシン上で実行されているさまざまなアプリケーションとどの程度対話しているかを追跡できるようにする必要があります。私にとって論理的だと思われたのは、ウィンドウ フォーカス イベントのログをタイムスタンプとともに保存し、その日を通じてどのアプリケーションがフォーカスされていたかを示すことです。
このアプリケーションでは、Java で簡単に実行できる処理が他にもいくつかあります。ただし、私は Java で GUI プログラミングをしたことがないので、awt API を通じて OS レベルのウィンドウに関する情報を取得できるかどうかはわかりません。それは可能ですか?JNI を介してこれを行う別の方法はありますか、それともこれを行うにはネイティブ アプリケーションが必要ですか?
追伸:この要件は少し邪悪に聞こえるかもしれませんが、私はこれが技術的に可能かどうかを判断するためにここにいるだけです。メッセンジャーを撃たないでください、これは私の考えではありませんでした。:)
解決
フォーカス イベントは機能する可能性があります。Windows も検討してみてはいかがでしょうか キーボードとマウスのフック. 。これらのアプローチのいずれかを使用する場合は、DLL (ネイティブ コード) を作成し、JNI を使用してそれにアクセスする必要があります。
他のヒント
ネイティブコードに頼ることなく、これが可能になるとは思わない。
ウィンドウテストライブラリを探します。これらの一部は、win32ネイティブイベントを作成およびインターセプトするために作成されています。
AWTを使用してこれが可能になるとは思わない。 Javaには、他のアプリケーションのプロセスにアクセスする方法がありません。
別の言語の使用を検討する必要があると思います。
たとえば、この種の問題のために事前に分類されているC ++などの他の言語があります:
基本的に、アプリを他のアプリケーションへのOS通知に含めるように求めています。おそらく、他のアプリを子プロセスとして起動するアプリが必要になるか、ルートキットAPIのようなものを使用して、通常のアプリが許可されている以上のアクセス許可を確立する必要があります。
ユーザーがアプリケーションと対話している時間を確認することが目的の場合、アプリケーションにスケジュールされているCPU時間や、I / Oイベントとマッピングの間の遅延を調べることで、大まかなアイデアを得ることができます。これらは、ユーザーのアクティブ性に関する統計に含まれています。
そうでなければ、必要なものを入手するために、いくつかのスパイウェア開発者と連絡を取ることができると思います。
Javaからこれを行いたい場合、独自のネイティブコードを書きたくない場合は、 SWT 。私はそれがあなたが望むものを達成するプラットフォームに依存しない方法を持っているとは思いませんが、Windows固有のクラス、特にorg.eclipse.swt.internal.win32.OSをいじることができます。
Windowsタスクリストを監視して、ユーザーが使用するアプリケーションをトレースすることもできます。また、Javaでコンソールを読み取ることも簡単です。プロセスデータを取得することもできますが、取得するデータは文字列形式であり、必要なデータを取得する必要があります。さらに支援が必要な場合は、そのデータを監視してトレース用に保存するためのコードを提供できますが、このソリューションウィンドウイベントをオーバーライドせず、タスク情報を提供します。