こんにちは
シュンスケです
前回に引き続き、Visual Studioの拡張機能開発に触れてみます。
今回は、イベントを検出してみます
1.ソリューションの作成
Visual Studioを起動
メニューのファイル→新規作成→プロジェクト
今回もC#で書こうと思うので、
C#→Extensibility→VSIX Project
ソリューション名は「VSIXTest2」
2.VSPackageの追加
プロジェクトを右クリック→追加→新しい項目
Visual C# アイテム→Extensibility→Visual Studio Package
ファイル名は、「VSPackageTest.cs」
いろいろと追加されますが、メニューに比べてリソースが少ないぶんシンプルです。
3.解読
VSPackageTest.csを開いてみると、Packageクラスを継承したVSPackageTestクラスが作成され、
コンストラクタと、オーバーライドされたInitializeだけがある状態です。
どうもこのInitializeを起点に拡張できるようです。
4.マニュアルを読む
3で解読した構成を頭に置きながら、公式のマニュアルを読みます。
機械翻訳された日本語でかなり難解ですが、フィーリングで読みます。
「Visual Studio 拡張機能の開発を始める」を見ていくと、サンプルの置き場が案内されています。
これは大いに参考にできそうです。
更に読み進めると、前回のメニューへの追加や、プロジェクトの拡張、ソリューションの拡張などが出てきますが、今回やりたいこととは少し違いそうです。
すると、「Visual Studio の他の部分の拡張」に、「VSPackage を使用した拡張機能の作成」という
項目があり、3で見たようなコードが出てきました。
ここでは、Initializeの中でメッセージボックスを開くコードが紹介されています。
また、Packageに新たなAttributeが付いており、これがPackageが作られて動くタイミングを決めているようです。
[ProvideAutoLoad(UIContextGuids80.SolutionExists)]
これはおそらく、ソリューションが存在すればPackageが作成されるということでしょう。
これでなんとなくPackageを使った拡張開発の構成がわかりました。
Visual Studioは起動中に様々なサービスが立ち上がっており、Packageは窓口になっているので、
サービスを取得して干渉したり、得た情報を使って新たなサービスを作成したりすることで拡張出来るといったところでしょう。
読み飛ばしたものがいくつかあるので、これが全てでは無さそうですが、機能の多くを担っていそうです。
5.APIリファレンスを読む
ここまでわかればあとは根気です。
マニュアルにあったAPIリファレンスを見ていき、今回使えそうなサービスを探します。
サービスはSVsから始まっているようなので、そのあたりを探ります。
また、SVs~から始まるサービスインターフェースに対応したIVs~系を見ていくとインターフェースがわかり、どんな機能を持っているかが推測しやすいです。
ただ、見ていくと、「Microsoft Internal Use Only.」という説明が多く出てくるので、使ってはいけない機能もほどほどあるようです。
で、ありました。「IVsRunningDocTableEvents3」です。OnBeforeSaveといういかにもなコールバックを持っています。
こいつを使う方法を調べるのが良さそうです。
6.サンプル登場
いよいよ大詰め、遂にサンプルの登場です。
探してみると、ありますね。
「Running Document Table (RDT) Event Explorer Sample」
ザックリ読み解くと、サービスプロバイダーなるものからRunningDocTableを作成しつつ、
そこにIVsRunningDocTableEventsを継承して作成した言わばリスナーを登録して、イベントをフックできるようです。
7.コーディング
さて、それでは、コードは以下の通りです。
ファイルの保存を検出して、メッセージを表示してみました。
8.ビルドして実行
実行すると、別のVisual Studioが起動しますが、まだ何も起きません。
ここで、ソリューションを新規で作成します。
cppファイルも作成してみます。作成時にはメッセージは出ません。
保存すると、
出ました
今回は以上です。
では