MENU閉じる

HEXA BLOG

プログラム

HEXA BLOGプログラム2018.5.31

拡張!~イベント検出編~

こんにちは

シュンスケです✨

前回に引き続き、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が起動しますが、まだ何も起きません。
ここで、ソリューションを新規で作成します。

すると、3回メッセージが出ます。


ソースコード以外のファイルにも反応するようです。

cppファイルも作成してみます。作成時にはメッセージは出ません。

保存すると、

出ました❤

今回は以上です。

では🎵

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE