編集中のプレゼンテーション、スライドを取得する

using PowerPoint = Microsoft.Office.Interop.PowerPoint;

public partial class ThisAddIn
{
    PowerPoint.Presentation GetActivePresentation()
    {
        return this.Application.ActivePresentation;
    }

    PowerPoint.Slide GetActiveSlide()
    {
        return this.Application.ActiveWindow.View.Slide as PowerPoint.Slide;
    }
    :
}

選択中のスライド、シェイプを取得する

using PowerPoint = Microsoft.Office.Interop.PowerPoint;

public partial class ThisAddIn
{
    PowerPoint.Selection GetSelection()
    {
        try {
            return this.Application.ActiveWindow.Selection;
        }
        catch (System.Runtime.InteropServices.COMException exc) {
            // TODO
        }
        return null;
    }

    PowerPoint.SlideRange GetSelectedSlideRange()
    {
        PowerPoint.Selection selection = GetSelection();
        try {
            return (selection != null) ? selection.SlideRange : null;
        }
        catch (System.Runtime.InteropServices.COMException exc) {
            // TODO
        }
        return null;
    }

    PowerPoint.ShapeRange GetSelectedShapeRange()
    {
        PowerPoint.Selection selection = GetSelection();
        try {
            return (selection != null) ? selection.ShapeRange : null;
        }
        catch (System.Runtime.InteropServices.COMException exc) {
            // TODO
        }
        return null;
    }

    public void Test()
    {
        PowerPoint.SlideRange selectedSlideRange = GetSelectedSlideRange();
        PowerPoint.Slide firstSelectedSlide = selectedSlideRange[1];
        PowerPoint.ShapeRange selectedShapeRange = GetSelectedShapeRange();
        PowerPoint.Shape firstSelectedShape = selectedShapeRange[1];
    }
    :
}   

スライドが選択されていない時にselection.SlideRangeを呼ぶとSystem.Runtime.InteropServices.COMExceptionが生じるようです。
同様に、シェイプが選択されていな時にselection.ShapeRangeを呼ぶと
System.Runtime.InteropServices.COMExceptionが生じるようです。

上図のようにスライド間にカーソルがあるときは、スライドは選択されていません。
得られたSlideRange, ShapeRangeのインデックスは1から始まります

VSTOファイルのパスを取得する

レジストリに登録されている情報を利用して.vstoファイルのパスを取得する方法。

private const string REGKEY_ADDIN = @"Software\Microsoft\Office\PowerPoint\AddIns\MyPowerPointAddIn";

string GetVstoFilePath() {
    Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(REGKEY_ADDIN);
    if (regkey == null) { return null; }
    string manifest = regkey.GetValue("Manifest") as string;
    if (string.IsNullOrEmpty(manifest)) { return null; }
    int barIndex = manifest.LastIndexOf("|");
    return (barIndex == -1) ? manifest : manifest.Substring(0, barIndex);
}

上記はアドイン名がMyPowerPointAddInというアドインの場合です。使用する場合はREGKEY_ADDINの最後のアドイン名を適宜変更してください。

マーク

久しぶりにChromium OSのソースをsyncさせたらこんなのが出力されました。
面白かったので記念に。

Syncing work tree: 100% (86/86), done.  

            ..77IIIIII7,.
           .$IOOOOOOOOOOZ$:.
        .IO8?OOOOOOZOOOOOOOO.
        ?=?~?ZO+D8888=+OZOOOOI.
      .7$+I+++888$IIO$8+=OZZZOI.
     .ZZ$$I?~I8$7?++?I7Z88888IZ:
     ~IZ$$7I~8OII?=~+I$Z8:++=ZD$
     IZZZ$$7~8ZZ$I??I$7D8:+++??I.
     I$ZZZ$$?=DOOZ$$ZOD8:=+++??I.
     77OZZZ$$+=8DDDDDDO:=+++???I
     .OOOOZZZ$$==7D,:::++++???I?
     .$$OOOOZZZ$8~===+++++???I?.
       7$OOOO$8=====+++++??II?..
        ?$ZO8:===+++++++?I???.
         .77$D8+++++++=?+??..
            ,7$8Z===+++??
               ........
Your sources have been sync'd successfully.

アドインのインストーラを作成する

アドインプロジェクトの変更

インストーラを作成したアドインプロジェクトを開きます。ここではMyPowerPointAddInプロジェクトとします。

[1]http://code.msdn.microsoft.com/VSTO3MSI/Release/ProjectReleases.aspx?ReleaseId=729

リンク[1]からVSTO v3 Deployment Whitepaper downloads.zipをダウンロードします。

ダウンロードファイルの

VSTO v3 Deployment Whitepaper downloads\samples\CS\3. Inclusion list\VSTO v3 Deployment Demo\InclusionListCustomActions\TrustInstaller.cs

をMyPowerPointAddInプロジェクトに追加します。また、

System.Configuration.Install
Microsoft.VisualStudio.Tools.Office.Runtime.v9.0

の2つのアセンブリを追加します。


TrustInstaller.cs内のRSA_PublicKeyの値を変更する必要があります。
そのためにMyPowerPointAddIn.dll.manifestを開き、<RSAKeyValuegt;から</RSAKeyValue>までをコピーします。
TrustInstaller.cs内のRSA_PublicKeyの値をコピーした値に置き換えます。
最後にビルドして、アドインプロジェクトの変更は終了です。

セットアッププロジェクトの新規作成

インストールしたいアドインプロジェクトと同じソリューションにセットアッププロジェクトを作成すると、インストーラの作成が正しく行われないことがあります。
念のため新規ソリューションでセットアッププロジェクトを作成します。MyPowerPointAddInSetupとしました。

インストールするファイルの指定


アプリケーションフォルダにアドインプロジェクトの作成物を追加します。

レジストリの設定

レジストリエディタで

HKEY_CURRENT_USER\Software\Microsoft\Office\PowerPoint\AddIns\<プロジェクト名>

のキーを追加します。

Description,FriendlyNameという文字列値を追加し、アドイン名を指定します。
LoadBehaviorというDWORD値を追加し3を指定します。
Manifestという文字列値を追加し[TARGETDIR]<.vstoファイル名>|vstolocalを指定します。

今回のMyPowerPointAddInでは以下のように設定しました。

HKEY_CURRENT_USER\Software\Microsoft\Office\PowerPoint\AddIns\MyPowerPointAddIn

Description  : MyPowerPointAddIn
FriendlyName : MyPowerPointAddIn
LoadBehavior : 3
Manifest     : [TARGETDIR]MyPowerPointAddIn.vsto|vstolocal

必須コンポーネントの追加

プロジェクトのプロパティダイアログから、[必須コンポーネント]を選択します。そしてVisual Studio Tools for The Office system 3.0 Runtimeにチェックを入れます。

カスタム動作の指定

カスタム動作エディタを開き、インストールの項目にMyPowerPointAddIn.dllを追加します。そしてCustomActionDataプロパティを以下のように指定します。

/deploymentManifestLocation="[TARGETDIR]<.vstoファイル名>"

確定、ロールバック、アンインストールの項目にもMyPowerPointAddIn.dllを追加します。CustomActionDataプロパティは空のままにしておきます。

ビルド

完成。MyPowerPointAddInSetup.msiというインストーラが作成されます。
アンインストールには以下の2つの方法が利用できます。

  • インストーラから削除する。
  • [プログラムの追加と削除]から削除する。

無効なアプリケーションアドインからの復帰

作成しているアドイン内で例外が生じた場合や、デバッグ中にVisual Studio側からでバグを停止したりすると、アドインが無効にされてしまいます。

[1]How to: Re-enable a VSTO Add-in that has been disabled - Visual Studio | Microsoft Docs

詳しくは[1]に解決法が書いてあります。[1]によるとソフトな無効化とハードな無効化の2種類があるようですが、私はハードな無効化しかなったことがありません。以下はハードな無効化からの復帰方法の抜粋です。

1.アプリケーションの Microsoft Office ボタンをクリックします。
2.[<アプリケーション名> のオプション] をクリックします。
3.カテゴリ ペインの [アドイン] をクリックします。
4.詳細ペインの [無効なアプリケーション アドイン] ボックスの一覧からアドインを探します。 
[名前] 列でアセンブリ名を指定し、[場所] 列でアプリケーション マニフェストの完全パスを指定します。
5.[管理] ボックスの [使用できないアイテム] をクリックし、[設定] をクリックします。
6.アドインを選択し、[有効にする] をクリックします。
7.[閉じる] をクリックします。

何もしない空のPowerPointアドインの作成

アドインの中身は後々追加するとして、とりあえず何もしないPowerPointアドインを作成します。

Visual Studioで新規プロジェクトを作成します。
PowerPoint2007アドインを選択します。
ここではC#で選択しますが、VB.NETでも同様だと思います。
アドイン名はMyPowerPointAddInにしました。適宜読み替えてください。

ThisAddIn.csというファイルが作成されます。このファイルをベースにアドインを作成していきますが、今回は何もしない空のアドインを作成するので、何も追加しません。

ビルドし、実行してみるとPowerPointが自動で起動します。特に見た目に変化は無いですが、アドインはちゃんとロードされています。
[Officeボタン]、[PowerPointのオプション]、[アドイン]の[アクティブなアプリケーションアドイン]の中にMyPowerPointAddInがあるのがわかります。

以上で何もしない空のアドインの作成は終了です。