Go で Windows API をいじってみたかったのと、実用上のために、Go でコマンドラインツールを作ってみました。
概要
obit というコマンドラインツールを作りました。
現在のところ、個人的な環境の関係上、Windows オンリーです。
既に起動中のウィンドウタイトルもしくはプロセス名を渡すことで、そのプログラムが終了するまで待機するツールです。
実行例
> obit メモ帳 秘密のテキスト
obit は、引数に渡された名前(スペース区切り可)をすべて含むようなウィンドウもしくはプロセスを検索し、そのプロセスの終了まで待機します。
対象のプロセスが終了した際、obit は標準出力にそのプロセスに関する情報を出力します。
待機対象が複数の場合は、プロセスが終了する毎に出力されます。
上記の結果
秘密のテキスト.txt - メモ帳(notepad.exe)
ちなみに、obit の名前は「obituary (死亡記事)」からとっています。
開発
基本的には、DLLの呼び出しは syscall.NewLazyDLL と NewProc を使っています。
この場合、Windows API との呼び出しや戻り値の取得は uintptr を使ってすることになります。この変換が地味に面倒です。
その点、golang.org/x/sys/windows 便利ですね。
相当数の API の呼び出しがラッピングされています。自然な型を使って Windows API が呼び出せるのでコーディングがしやすいです。
ただ、カバーされていない API もあり、その場合は仕方なく上に挙げた方法で呼び出しをしています。