ふにゃるんv2

もとは、http://d.hatena.ne.jp/Wacky/

ビルド完了時に音を鳴らすには? for VS2008

Visual Studio上でプロジェクトをポンポン追加しながらプログラミングしていると、少しずつビルド時間が長くなってきました。
一つ一つのコンパイル時間は短いのですが塵も積もれば何とやら。それに、C++プロジェクトを一つ追加すると ぽ〜んとコンパイル時間が長くなりますしね。


遥か古の時代では、たかだか1パスのアセンブルをするだけで、十分コーヒータイムが楽しめたそうですが、今は 加速度的に単位辺りの時間密度が上昇しているので、ちょっと空いた時間に、何か別の作業をしたくなります。


という訳で、ビルド作業が完了すると音を鳴らしたくなりました。

Visual Studio 2003までの話

Visual Studio 2003までは、コントロールパネルの「サウンドとオーディオデバイス」の「サウンド」タブで、ビルド完了時に好きな音を割り当てる事ができました。

Visual Studio 2005からの話

Visual Studio 2005でも同じ事が出来るのだろうと思って、コンパネから設定してみるんですが うまく行かない。
おかしいな?と思って ぐぐると、どうやら出来ないものらしいです。


上のスレッドで紹介されているフィードバックの所に、「Sounds have been deliberately reomved for security reason.(機械翻訳に掛けると"音はセキュリティ理由で故意に削除されました。")」と書かれているんですね。Ouch!!


対処方法なんですが、Visual Studio 2005の場合、2つあります。

  1. Visual Studio 2005 IDE EnhancementsのEvent Toaster Utilityを使う
  2. イベントマクロを組む


一番お気楽なのは、Event Toasterでしょうね。何しろマイクロソフトサイトでゲットできますから。
イベントマクロについては、 id:ir9Ex さんやCodeProjectにて記事にされています。

技術的には、「EnviromentEventsモジュールのBuildEvents.OnBuildDone イベントをフックせよ」という事みたいです。

Visual Studio 2008の場合

ところで、Visual Studio 2008でも上記テクニックは使えるのでしょうか?
自分が調べた所、

  1. Event Toaster Utilityは使えなかった
  2. イベントマクロで組むのはOKだった

でした。


Event Toasterの方は、DLLをPrivateAssembliesに持っていってみたりしたんですが、どうも設定が必要なようで、うまく行きませんでした。
VS2008 SDKに入ってないかな〜と思って、少し覗いてみたんですが、これかな?というのも見つからない。(調べ方が甘いかな?)
Visual Studio 2008 IDE Enhancements」ってのが出るまで待ちかな〜と。


しょうがないので、マクロで組む事にしました。

「ふにゃるん」版のビルド完了の音通知マクロ

マクロで組む事にして、上記の id:ir9Ex さんのコードCodeProject のサンプルコードを眺めていて思った事。

  • 何で、ビルド成功/失敗を検出するのに、"出力"ペインを解析しているんだろう?

次に思った事。

  • マイクロソフトさんが、こんな不確実な判別手法を用意する訳が無い。何か他に成功/失敗を区別する方法を提供しているハズだ


そこで、MSDN Libraryのヘルプを数時間ほど眺め続けたんですが、どうも判らない。
しょうがないので、そこいら中にデバッグコードを ぶち込んで動きを眺めていたら、BuildEvents.OnBuildProjConfigDone イベントと BuildEvents.OnBuildDone イベントを組み合わせると、成功/失敗をチェックできる事に気づきました。


という訳で、「ふにゃるん」版のビルド完了の音通知マクロです。

    Public Enum PlaySoundFlags
        SND_SYNC = &H0
        SND_ASYNC = &H1
    End Enum
    Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As PlaySoundFlags) As Long

    Dim g_ビルド成功数 As Integer
    Dim g_ビルド失敗数 As Integer

    Private Sub BuildEvents_OnBuildBegin(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildBegin
        g_ビルド成功数 = 0
        g_ビルド失敗数 = 0
    End Sub

    Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
        If g_ビルド失敗数 > 0 Then
            ' ビルド失敗時のチャイム音
            sndPlaySound("C:\tool2\TortoiseSVN\bin\TortoiseSVN_error.wav", PlaySoundFlags.SND_ASYNC)
        Else
            ' ビルド成功時のチャイム音
            sndPlaySound("C:\tool2\TortoiseSVN\bin\TortoiseSVN_Notification.wav", PlaySoundFlags.SND_ASYNC)
        End If
    End Sub

    Private Sub BuildEvents_OnBuildProjConfigDone(ByVal Project As String, ByVal ProjectConfig As String, ByVal Platform As String, ByVal SolutionConfig As String, ByVal Success As Boolean) Handles BuildEvents.OnBuildProjConfigDone
        If Success Then
            g_ビルド成功数 += 1
        Else
            g_ビルド失敗数 += 1
        End If
    End Sub


コードの組み込み方は、Visual Studio 2008を起動した状態で、メニューから「ツール」→「マクロ」→「マクロIDE」を選択すると、マクロ用のエディタが起動しますので、プロジェクトエクスプローラの「MyMacros」→「EnvironmentEvents」をダブルクリックして、上記コードを貼り付けてください。
1
1 posted by (C)wacky

後、BuildEvents_OnBuildDoneメソッド内の、sndPlaySound関数の第一引数に、自分の好きなWAVファイルを指定して下さい。
(私のは、TortoiseSVNの音を割り当ててみました)


これを組み込むと、ビルド成功/失敗に合わせて、音が変わって知らせてくれます。

最後に(オチ)

「出来た〜」と思って気づくと、既に半日が過ぎていた。orz