OfficeExtention Archive

Visual studio 2008 Academic Editionでは、以前のversionとは異なり、Professional Editon相当の機能を与えられている。それを活用しないというのではなんとなくもったいない。そこで今回はProfessional Editon以上にのみ与えられている機能である、Visual Studio Tools for Office(VSTO)を使用したプログラミングに取り組んでみることにした。

今回のお題は「Power Pointのスライド送りをマウスジェスチャで出来るようにする」というもの。家に転がっていたVAIOの周辺機器カタログを見ていたところ、スライド送りがボタン操作で出来るプレゼン用マウス?なるものが発売されていることを知り、そんなものを買わないでもBluetoothマウスひとつあれば済むようにしたいな、という考えから。結局断念する結果になったが、一応メモとして。

プロジェクトの作成

image2 早速projectを作成。この際、.NET Framework3.5に切り替えておかないと、Office 2007向けのアドインのテンプレートが表示されない点に注意。Office 2003向けのアドオンは.NET Framework2.0で開発できるが、確かユーザーのOfficeのEditionが、Professional Edition以上か、バラ売り製品でないとダメ、つまり、Standard Edition や Personal EditionのOffice 2003ユーザーは使えない、という、正直理解しかねる制約があるので、ここは後方互換性を切り捨ててPower Point 2007アドインとして開発することにする。(2007ならEditionは問われない)

さて、そうしてテンプレートから生成されたソースコードは以下の通り。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using Office = Microsoft.Office.Core;

namespace PPGesture
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO で生成されたコード

        /// <summary>
        /// デザイナ サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディタで変更しないでください。
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        
        #endregion
    }
}読んでの通り、アドインがアタッチされるときにThisAddIn_Startupメソッドが呼び出され、アドインがデタッチされるときにThisAddIn_Shutdownメソッドが呼びだされるらしい。MSが配布しているサンプルなどを見ると、ThisAddIn_Startupメソッドが呼び出された時にカスタム作業ウィンドウなどの追加を済ませてしまうようである。

マウスジェスチャはスライドショーの実行中に取得したいので、とりあえずここでスライドショーの開始・終了を拾うイベントハンドラの登録を済ませる。

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            this.Application.SlideShowBegin += new Microsoft.Office.Interop.PowerPoint.EApplication_SlideShowBeginEventHandler(Application_SlideShowBegin);
            this.Application.SlideShowEnd += new Microsoft.Office.Interop.PowerPoint.EApplication_SlideShowEndEventHandler(Application_SlideShowEnd);
        }IDEによって生成されるイベントハンドラは以下の通り。 

        void Application_SlideShowBegin(Microsoft.Office.Interop.PowerPoint.SlideShowWindow Wn) {
        }       
 
        void Application_SlideShowEnd(Microsoft.Office.Interop.PowerPoint.Presentation Pres) {
        }

さて、引数で渡されるMicrosoft.Office.Interop.PowerPoint.SlideShowWindowにMouseMoveとかのマウスイベントがあればよかったのだが、それが、無い。

参った。困った。仕方ないのでTimerでミリ秒単位でマウスの位置を右マウスボタンの押下状態を監視して代用することに。そのためにこさえたクラスがTimerBasedMouseGesture。image3

クラスダイヤグラムを表示するとこんな感じのクラス。これでスライドショー実行中のマウスジェスチャを取得できる見通しが立ち、ここまでは良かったのだが・・・、よく考えたらコンテキストメニューをキャンセルできないよorz

Power Pointでは、スライドショーの実行中に右マウスボタンを押下すると、コンテキストメニューが表示されるのだが、マウスイベントが取れないのだから、コンテキストメニューの表示をキャンセルすることも出来ない。というわけでこのアドオンも断念。誰か分かる方、解決策を授けて下さい・・・。アンマネージコードを使えば、解決できる・・・のか?