読者です 読者をやめる 読者になる 読者になる

【VSTO】Outlookのインライン返信対応のアドイン

C# VSTO

(VSTO Outlook Addin Inline Response)
Outlook2013からインライン返信の機能が追加されています。
メール返信時に新規ウィンドではなく、Outlookの画面内にメール編集画面が表示されるというタブレット向けの機能です。

規定値で、有効になっていて、
オプション->メール->"返信と転送を新しいウィンドで開く(O)"にチェックを入れると従来通りの挙動になります。
音速でチェックを入れるので気にしてなかったし存在すら忘れてたし。

普通にメール編集ウィンドが出た場合には、添付ツールが使えて、インライン返信時に使えないのは許せいない。
f:id:orzmakoto:20150401235742p:plain
メール編集画面にはアドインを仕込んでいるのに表示されない。
メッセージのタブの隣についでに出してくれればいいのに・・・

問題

今まで、リボン(ビジュアル)をデザイナで作っていましたが、XMLで作成しなければなりません。

デザイン(XML)側の実装

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon startFromScratch="false">
    <contextualTabs>
      <tabSet idMso="TabComposeTools">
        <tab idMso="TabMessage">
          <!--ユーザータブの実装 ここから-->
          <group label="添付ツール" id="MyGroup">
            <button id="addAttached"
              size="large"
              label="追加&#xd;&#xa;"
              showImage="true"
              getImage="GetImage"
              onAction="OnAddAttached" />
          </group>
          <!--ここまで。-->
        </tab>
      </tabSet>
    </contextualTabs>
  </ribbon>
</customUI>

”ここから~ここまで”の間にUIを記述します。
久々にXMLで記述しましたが、いろいろ変わったお作法が多いです。
getImage:ボタンの画像を取得する関数を記述します。
onAction:ボタン押下時のイベントを指定します。onClickじゃないんです。すべてのイベントは、onAction属性で指定します。

イベントハンドラ側の実装

using Office = Microsoft.Office.Core;

public void OnAddAttached(Office.IRibbonControl control)
{
  //添付処理
}
public Bitmap GetImage(IRibbonControl control)
{
  switch (control.Id)
  {
    case "addAttached": return new Bitmap(Properties.Resources.addAttached);
  }
  return null;

}
#region IRibbonExtensibility のメンバー

public string GetCustomUI(string ribbonID)
{
  if (ribbonID == "Microsoft.Outlook.Explorer")
  {
    return GetResourceText("OutlookAddIn4.Ribbon1_Xml.xml");
  }
  return "";
}

#endregion
GetCustomUI(string ribbonID)

メール返信時ですが、リボンを表示する位置は、Outlookのメインウィンドになるので"Microsoft.Outlook.Explorer"を指定します。

できあがり

f:id:orzmakoto:20150402002840p:plain
本当は、メッセージのタブの横に"添付ツール"を並べたいのですが方法がわからず・・・
とりあえずこの方法で妥協しようかと悩み中です。