[BlueLeaf1336]>
PROBLEMS>
RecentApps>
RecentApps > 今度こそアプリケーションの起動終了を監視
2005/02/21:作成
2005/02/26:更新
2005/02/27:更新
2005/02/28:更新
2005/03/02:更新
タイトルどおりです。
軽く復習しておくと、現在できているのは
- タスクトレイアプリケーションであること
- あらゆる(のはず)ウィンドウの生成と破棄の瞬間に立ち会えること
だけです。さて、ウィンドウの生成の瞬間には、ウィンドウハンドルをもらうこともできています。で、Windowsにおいては、ウィンドウハンドルさえわかれば芋づる式に、なんでもかんでも引きずり出せる、ような感じがします。
このページでは、ウィンドウハンドルをみて、(1)それがアプリケーションの最初のウィンドウであること、(2)そのウィンドウの持ち主であるアプリケーションの所在地(フルパス)を探り当てること、を目的とします。目的とするといっても、どちらも(自分にとって)既知の方法を当てはめるだけです。
まず、「アプリケーションの最初のウィンドウであること」については
に、もろにその方法(ただし、アプリケーションの最初のウィンドウであるかどうかは実は多分不明です。でも近似値としては充分かと)が記載されています。
また、ウィンドウの持ち主であるアプリケーションのパスについては、このサイト内に答えがあります。
現在、CBTフックを使っているんですが、とにかくすごい量のウィンドウが作られ捨てられています。この量を減らすためにも、最初に一つ目っぽいウィンドウの絞込みから行います。
...というわけで、
- ウィンドウの生成を監視するも、所有者のいないウィンドウだけを捕まえるようにした。
- ひとたびアプリケーション代表と認めたウィンドウについては、アプリケーションのパスを取得するようにした。
- 同じアプリケーションが何度起動されても、また終了されても、一つ目の起動と一つ目の終了を対象とすることにした(たった今気づきましたが、これまずいです。起動した逆のジュンでウィンドウが閉じられることを期待してしまっています)。
20050221RecentApps.zip(222,584bytes)(22,401bytes)
この時点で、確実にWindowsNT系のOSでしか動作しなくなりました。SDKにそう書いてあるAPIを使用しているためです。ウィンドウハンドル > プロセスID > プロセスハンドル > モジュールのフルパス、という流れで処理しています。
そんな問題でもないぐらいに不備が見えてきましたが、今日は遅いのでここまでにします。また、当初の目的は果たしたようですので、こんなもんで終わります。
試行錯誤中です。前回の最後に書いた問題点とは、同一のアプリが何度も起動された場合(エディタなどなんぼでも起動します)に、パスとデータの1レベルで管理していると対処できないという点です。書きにくいので端折りますが。
でまあ、現時点では、全く駄目駄目ですが、感じ的には少し前に進んだようです。方針としては、(NT系限定ですが)
- ウィンドウハンドルが作られた時点に立ち会うことができる
- ウィンドウハンドルの持ち主のアプリケーションのパス(C:\Temp\Test.exe とか)を取得できる
- ウィンドウハンドルからプロセスIDを取得することができる(=妄想では、同一のアプリケーションを複数起動された場合に、ウィンドウハンドルがどちらに所属するかを区別できる)
- 短時間の内にプロセスIDは再利用されないだろう...
- フルパスとプロセスIDを一組にして、起動時間を管理しよう
- 意味がわからなくなってきたのでこのあたりで説明終了
というわけで、しばらく沈黙することになります。ただし、参考にしたサイトを記録していきます。
20050226RecentApps.zip(260,252bytes)(32,840bytes)
こんな感じになってます。
使い勝手は最悪で、作った本人しかわからないと思います。もちろん今のところだけであって欲しいものです。ただ、このまま放っておくと自分でもわからなくなる可能性があるので、少しだけ説明を書いておきます。
- CBTフックを使用しているので、EXEと「hook.dll」は同一のフォルダに置くこと。
- 起動するとタスクトレイに引っ込む。ウィンドウの作成を監視しつづけてます。
- タスクトレイのアイコンをクリックするなり右クリックメニューなりで、ランチャー画面を表示する。
- それまでに溜め込んだ(溜め込むことができた)全てのアプリケーションの一覧が表示される。
- タイトル行をクリックすると昇順/降順を切り替えてソートできる。大体で。
- 一覧を選択した状態でダブルクリックするとそれが開く。
- 一覧右クリックでいくつかメニューが開く。
- 一覧は、タスクトレイアイコンをクリックした時点のスナップショットのため、表示したままでは更新されない。画面を更新したい場合は、再度タスクトレイアイコンをクリックする。
- データは、アプリケーションの置いてあるフォルダに、iniファイルとして保持される。適当。
- 最後の起動日時・起動回数・起動時間合計を表示しようとたくらんでいるが、数字が滅茶苦茶怪しい。どうみても...な感じ。ただし、起動日時はそこそこそれっぽくなっている。
いくらでも気になる箇所はあるんですが、とりあえずプロトタイプっぽいものができたような感じがしています。とりあえずここまで。
作りこむ前に、少しずつコードの整理などを行います。といいながら、機能追加してみたり。
途中公開。20050227RecentApps.zip(281,764bytes)(33,256bytes)
- バージョン情報画面を修正
スタートアップ系の処理をこの画面から実行するようにしてメインメニューから削除
- タスクトレイアプリケーション作成支援クラス用のユニットを削除
メインフォーム(非表示)のユニットに処理を移動(ユニット数の削減のためと、別のプロジェクトで使用する場合でも、この組み合わせは変更されないはずのため)
- ランチャー画面表示のためのスナップショット作成処理変更
そのアプリケーションのパスが実在のものかどうかをチェックする処理を追加
- 管理データから、アプリケーションの総起動時間数を削除(意味ないし)
- ダブルクリック時のランチャー処理で、ソートボタンダブルクリックに反応していたのを修正
- その他...
- 二重起動防止に使用しているGUIDが、以前のプログラムと重複していたのを修正。
- ランチャー画面とバージョン情報が、タスクバーに表示されないようにした。
SDIスタイル:[2005/03/01]
作業中。20050228RecentApps.zip(281,960bytes)(33,468bytes)
20050302RecentApps.zip(262,593bytes)
- ランチャー画面の位置を記録するようにした。毎回右下にやるのも鬱陶しい。
- アプリケーションを起動したらランチャー画面を閉じるようにした。微妙だが。
*02/02/2008 01:44:33
*BlueLeaf1336-PROBLEMS-2005_0014 > RecentApps > 今度こそアプリケーションの起動終了を監視 :: RecentApps > 今度こそアプリケーションの起動終了を監視
*<a target="link" href="http://blueleaf1336.g2.xrea.com/problems/2005_0014.html">BlueLeaf1336-PROBLEMS-2005_0014 > RecentApps > 今度こそアプリケーションの起動終了を監視 :: RecentApps > 今度こそアプリケーションの起動終了を監視</a>