Windowsのプログラミングに関する質問です。Windowsを使う際、画面上にはさまざまなウインドウが表示されると思います。これらウインドウの情報を取得したいのです。大まかな仕様は、以下のとおりです。


  ・ウインドウの開閉日時を取得したい
  ・ウインドウの名称も取得したい
  ・文書ファイルのウインドウの場合、その文書のファイル名も取得したい
  ・テキスト形式のログとして書き出したい
  ・対象を、利用者の操作によるウインドウオープンに限定しても良い

サンプルのコードを提示していただけると助かります。C#が第一希望ですが、VBやC++でも構いません。同様の処理を行うソース付きフリーウエアのご紹介でもOKです。GUIは不要です。

有益な情報には、50~100ptを送信したいと思います。個人的にズバリの場合、500ptまでお出しします。「不可能・難しい」などの理由付き回答でも構いません。。

できるだけ、Windowsプログラミングに長けている方のご回答が希望です。初心の方のGoogle結果でのご回答は、ご遠慮願います。

以上、よろしくお願いします。

# 私はUnix歴が長く、Winプログラミングは初級~中級です

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/11/07 15:07:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kazu1107 No.1

回答回数199ベストアンサー獲得回数14

ポイント120pt

フックをかけるというのはどうでしょうか?

ここで言うフックとはもちろんグローバルフックのことです。

残念ながらC#では出来ないようです(それどころかDLL形式で作成しなければなりません。)

全てを解説するのは難しそうなので、わからないことはある程度自分で調べた方が良いかと思いますが、要は「他のアプリケーションウィンドウに送られてきたメッセージを横取りする仕組み」と思ってください。


以下URLはご参考に

http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.h...

http://cgi.ipc-tokai.or.jp/~hitonaga/KIMAMA/index.cgi?page=PC/st...


やり方の要点だけ書いてみると、ウィンドウが開くときプロシージャには「WM_CREATE」メッセージが送られてきます。

この「WM_CREATE」メッセージが送られてきたタイミングの時間を自分で取得すれば、それがウィンドウオープン時の時間になります。

同じようにウィンドウが閉じられたとき「WM_DESTROY」が送られてきます。

一個目の条件はこれで解決できるかと。

二個目の条件は、「WM_CREATE」メッセージが送られてきたとき、一緒に送られてくるLPARAM型変数がCREATESTRUCT構造体型のポインタを表しますので、lpszNameからキャプションを取得できます。

三個目の条件なんですが、職場などで、ある程度アプリケーションが限定されているなら取得出来なくもないです。(たとえばキャプションにファイル名が出るならそこから取得してしまうとか)

要はシステムやメッセージを見るだけで「それが何をするアプリケーションなのか」を判別するのが難しいのです。

他の方法に「ファイルを書き込んだ時」をイベントとして取得する方法も考えられます。

id:Mugicha2004

詳細なご回答をありがとうございます。大いに参考になりました。ポインタ的にも有益な情報です。

当方の希望する仕様を実装するのは、あまり簡単ではなさそうですね。ううむ...という感じです。

このような機能を含むツールがあれば、ご紹介いただけると助かります。ソース付きだと、なお良いです。

機能を限定して、「doc・xls・ppt・txtの4種類のファイルのオープン時刻とクローズ時刻を知りたい」だと、まだ簡単になるでしょうか? 編集を伴わないケースも拾いたいのです。以前の質問では、標準のAPIで監視するのは難しく、フィルタドライバを入れないと無理だろう...とのご指摘でした。ファイルI/Oを横から監視するようなイメージでしょうか。

http://q.hatena.ne.jp/1152173784

もし、さらなるアドバイス的な情報がありましたら、よろしくお願いします。kazu1107さんには、100ptを送信させていただく予定です。

以上、よろしくお願いします。

2006/11/02 16:51:37

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません