使ってみよう! Windows Live SDK/API

第2回 Live Search API+VSTO

この記事を読むのに必要な時間:およそ 3 分

コンテキストメニューへメニューアイテムの追加

Wordのコンテキストメニューに検索結果を示すメニューアイテムを追加する処理を書きます。最初にインポートの設定をしておきます。

Imports Microsoft.Office.Core

ThisDocumentクラスには,右クリックされたとき既定の処理をする前に発生するBeforeRightClickイベントがあるので,これを利用します。コードエディタの左上のドロップダウンリストから「⁠⁠ThisDocument イベント⁠⁠」を選択し,右上のドロップダウンリストから「BeforeRightClick」を選択すると次のようにイベントハンドラのコードがクラスに追加されます。

Private Sub ThisDocument_BeforeRightClick(ByVal sender As Object, ByVal e As Microsoft.Office.Tools.Word.ClickEventArgs) Handles Me.BeforeRightClick

End Sub

このイベントハンドラ内に処理を追加していきます。

文書で選択されているテキストはパラメータeにより取得できます。実際には,テキストが選択されていない状態でもカーソルの右側にある文字が1文字格納されています。そのため,選択文字列の先頭と末尾の空白を削除した後に2文字以上ある場合,検索することにします。

Dim text = e.Selection.Text
If text.Trim.Length < 2 Then
    Exit Sub
End If

Officeのメニューアイテムやツールバーのボタンなどのコントロール群はすべてCommandBarオブジェクトから成っています※1⁠。

コンテキストメニューにメニューアイテムを追加するためには,コンテキストメニューを成すCommandBarオブジェクトを取得し,これが持つCommadBarControlコレクションに新たなメニューアイテムを追加します。そして,メニューアイテムのCommadBarButtonオブジェクトに適切な値を設定するという手順になります。

文書を右クリックしたとき表示される標準のコンテキストメニューのCommandBarsオブジェクトの取得は次のようになります。

Dim textCommandBar = Application.CommandBars("Text")

作成したSearchメソッドにより検索結果を取得し,結果件数分だけメニューアイテムを作成しコンテキストメニューに追加します。

Dim results = Search(text)
For Each result In results
    Dim commandBarButton As CommandBarButton
    commandBarButton = CType(textCommandBar.Controls.Add(MsoControlType.msoControlButton, , , , True), CommandBarButton)
    commandBarButton.Caption = result.Title
    commandBarButton.Tag = result.Url
    AddHandler commandBarButton.Click, AddressOf CommandBarButton_Click
Next

textCommandBar.Controls.Addメソッドの第1引数にMsoControlType.msoControlButtonを指定し,戻り値が追加されたCommandBarButtonオブジェクトになります。第4引数のTrueは一時的なコントロールであることを指定しています。

メニューアイテムのキャプションにはタイトルをそのまま表示し,URLを開くときに必要になるURLの文字列はTagプロパティを利用して記憶させておきます。また,AddHandlerステートメントを使いメニューアイテムのClickイベントをCommandBarButton_Clickプロシージャに関連付けています。プロシージャはこの後に作成します。

Clickイベントに関連付けるプロシージャは次のようになります。Ctrl.TagにはURLを入れてありますので,Process.Startメソッドを使用してURLに関連付いているアプリケーションを起動します。

Private Sub CommandBarButton_Click(ByVal Ctrl As Microsoft.Office.Core.CommandBarButton, ByRef CancelDefault As Boolean)
    System.Diagnostics.Process.Start(Ctrl.Tag)
End Sub

このまま実行すると右クリックするたびにメニューアイテムが追加されてしまいます。コンテキストメニューのCommandBarsオブジェクトを取得した後にResetメソッドを使い元の状態に戻しておきます。

textCommandBar.Reset()

実行と配布

以上のコードを以下にまとめましたので参考にしてください。例外処理も追加してあります。

ThisDocument.vbのダウンロード
ThisDocument.vbファイル

実行して図4のように選択したテキストの検索結果がメニューに表示されれば完成です。クリックするとそのWebサイトに移動します。いかがでしたでしょうか。

図4 実行結果

図4 実行結果

このテンプレートを配布する場合は,ソリューションエクスプローラでプロジェクト名を右クリックし,メニューの「発行」を選択します。すると,ウィザードによりセットアッププログラムsetup.exeの作成ができます※2⁠。また,セットアッププログラムに含めるコンポーネントなどの設定はプロジェクトのプロパティの発行タブから可能です。

※1

Office 2007からはツールバーはなくなり,リボンという新しいUIが登場しています。コマンドバーは古くから互換性のために残されているレガシーなオブジェクトと思われます。

※2

ウィザードの規定のインストールパスの指定で「CD-ROMまたはDVD-ROMから」を選びます。インストール先のコンピュータでsetup.exe実行後に作成したテンプレートのLiveSearchWordTemplate.dotxが開けるようになります。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp