使ったアプリのログを取るツールを作ってみた

ちょっと欲しくなったので作った。

名前は「あぷろぐ」。よろしくね。

これは何?

起動させると、コマンドプロンプト上で常駐する。あとは自動でアクティブなウィンドウのタイトルを記録していく。それだけ。

コマンドラインオプションで数字を渡すと、監視する間隔を変更できる。単位は秒で、デフォルトは10。あと終了するときは Ctrl + C ね。

ログは標準出力に吐き出すようになってるので、まあ画面に表示するだけでもいいし、テキストファイルにリダイレクトしてもいい。別なアプリの中から呼び出して、標準出力を監視するなどしてもいい。Twitterにポストするとかも面白いかも。

何に使うか

仕事で、なんの作業をしていたかの報告書を書かなきゃいけない事になってる。複数の案件を同時進行でやってると、一日にいろんな案件を切り替えながらやるので、あとで報告書を書くのがとっても大変。細かく思い出せない。

そこで、アクティブなウィンドウのログを取っておく事で、この報告書を書くときの負担(何やっていたかを思い出す作業)を少しでも減らそうというわけ。

他にどんなことに役立つかは良くわかんない。

仕組み

まあコードを見ればわかると思う。

// applog.cs
using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
using System.Reflection;

namespace nacookan.Applog
{
  class Program
  {
    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    [DllImport("user32.dll")]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

    static void Main(string[] args)
    {
      int interval = (0 < args.Length) ? int.Parse(args[0]) : 10;

      IntPtr last = IntPtr.Zero;
      while (true)
      {
        IntPtr hWnd = GetForegroundWindow();
        if (last != hWnd)
        {
          StringBuilder sb = new StringBuilder(1024);
          GetWindowText(hWnd, sb, sb.Capacity);

          int pid;
          GetWindowThreadProcessId(hWnd, out pid);
          Process p = Process.GetProcessById(pid);

          last = hWnd;

          string log =
            DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " +
            p.ProcessName + " : " + sb.ToString();

          Console.WriteLine(log);
        }
        Thread.Sleep(interval * 1000);
      }
    }
  }
}

今回はC#で作った。ホントはJScript.NETが良かったんだけど、Win32APIの呼び出しができないので仕方ない。まあC#とはいえ、この程度ならVisual Studioは不要。.NET Framework 2.0さえあれば以下のコマンドでコンパイルできる。

%windir%\Microsoft.NET\Framework\v2.0.50727\csc applog.cs

終わり

これで明日からラクになるのでうれしい!