Lync の Conversation Window 拡張 (CWE)


環境 : Lync Server 2010, Lync 2010, Visual Studio 2010, Silverlight 4 開発者向けランタイム, Lync 2010 SDK

Lync 2010 クライアント開発入門

こんにちは。(今日から出社です。) 今年も、よろしくお願いします。

年初めは、さっさと家に帰りたかったのですが、年末にブログを書き残したまま終わってしまったので、早速 続きから記載したいと思います。。。

前回までは、コントロールとプログラミングの基本的な概念を学びましたが、ここからは、Lync が持っている独自なフレームワークを使った開発手法を紹介しましょう。

Lync 2010 では、メニューの拡張など、標準の Lync クライアントを拡張させるいくつかの手法が提供されています。今回は、その中でも、現実のアプリケーション開発の中で非常に使える Conversation Window Extension (CWE、または、Conversation Packages) を説明します。
Lync API を使い回して、無理矢理 Lync と同じアプリケーションを構築するのではなく、次回説明する Contextual Conversation などと組み合わせ、より実用的なカスタム アプリケーションを開発してみましょう。

Conversation Window Extension とは ?

ここで紹介する Conversation Window 拡張 (CWE、または、Conversation Packages) は、下図のように、Lync の IM (Instant Messaging) における Conversation Window の右ペインで提供できる拡張 UI です。
アプリケーションは HTML ベースでホスト可能なため、これまで述べてきた Silverlight を使ったカスタム アプリケーションとの親和性に優れています。

この拡張機能は、下記の 2 つの方法 (いずれか) で配置可能です。

  • Install Registration
    この配置では、クライアント (利用者) 環境で、インストール作業 (レジストリー登録) をおこなう必要があります。
    レジストリーへの書き込みをおこなうことで、Lync 使用時に、いつでも呼び出すことができます。
  • Run-Time Registration
    プログラム コードによる一時的な拡張機能の登録が可能です。
    この方法だと、クライアント側でインストール作業は不要であるため、アプリケーションで一時的に使用する場合などには、有効な手段です。(なお、登録された内容は、Lync のサインアウトと同時に消失します。)

この CWE (Conversation Packages) は、ローカル ファイル、共有ディスク、Web サーバーのそれぞれの場所にホストして使用できます。このため、広く使われる製品アプリケーションなどの場合には、Windows Azure などに拡張機能をホストし、(Lync Online などを使用した) インターネット シナリオなどでもこの機能を使用することができます。

アプリケーションの作成

今回は、前回同様、Conversation で受信した文字列をそのまま表示する簡単な Silverlight のサンプル アプリケーションを CWE として構築します。
ほとんどのコードは前回と同じですが、一部だけ異なっている点があるので、よくコードを確認してみてください。

まずは、前回までと同様に、Visual Studio を起動して Silverlight アプリケーションを作成し、Microsoft.Lync.Controls.dll、Microsoft.Lync.Controls.Framework.dll、Microsoft.Lync.Model.dll、Microsoft.Lync.Utilities.dll の各アセンブリを参照追加しておきます。

そして、MainPage.xaml に TextBlock コントロールをドラッグ アンド ドロップし、以下の通り プログラム コードを記述します。
前回 (さいごに構築したサンプル コード) との相違が、おわかり頂けるでしょうか ?

. . .
using Microsoft.Lync.Model;
using Microsoft.Lync.Model.Extensibility;
using Microsoft.Lync.Model.Conversation;

. . .

private Conversation con;   // Conversation
private Participant par;   // 参加者 (誰か 1 人)
private InstantMessageModality im;   // その人との IM

public MainPage()
{
    InitializeComponent();
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    // Conversation を取得
    con = (Conversation)LyncClient.GetHostingConversation();

    // IM の参加者のうち、自分以外の誰か (最初の 1 人) を取得
    foreach (Participant x in con.Participants)
    {
        if (x.IsSelf == false)
        {
            par = x;
            break;
        }
    }

    // IM を取得
    im = (InstantMessageModality)par.Modalities[ModalityTypes.InstantMessage];

    // IM 受信の際のイベント処理
    im.InstantMessageReceived += new EventHandler<MessageSentEventArgs>(im_InstantMessageReceived);
}

void im_InstantMessageReceived(object sender, MessageSentEventArgs e)
{
    // 受信した IM の内容 (文字列) を TextBlock に表示
    textBlock1.Text = e.Text;
}

上記で、太字の箇所がポイントです。
前回のサンプルでは、Conversation が開始されたイベントを取得して、その開始された Conversation をすべて取得していました。
しかし、CWE では、必ず、ある Conversation の中で実行されるカスタム アプリケーションであるため、そのカスタム アプリケーションに関連付けられた Conversation のみを取得する必要があります。(複数の Conversation が同時に実行されている場合もあるため、どの Conversation が、そのカスタム アプリケーションに関連付けられているか特定する必要があります。)
上記の太字部分 (GetHostingConversation) は、その関連付けられた Conversation を取得するための static メソッドです。

CWE のインストール (Install Registration)

では、この拡張ウィンドウをインストールして使用してみましょう。

まず、上記の Silverlight アプリケーションを Web サーバー (IIS) 上に配置します。今回はオンプレミスのサーバー上に配置しますが、上述の通り、Windows Azure を使用して、公開された機能として配置しておくと良いでしょう。

インターネット インフォメーション サービス (IIS) マネージャを起動し、上記の Silverlight アプリケーション (厳密には、そのホスト用の Web アプリケーション) をアプリケーションとして追加します。
今回は、この公開されたアプリケーションの URL を http://kkdeveva01/CWESample1/CWESample1TestPage.html と仮定します。(第 2 回 で記述したように、このドメインを信頼済みサイトに設定しておいてください。)

つぎに、レジストリー登録 (Install Registration) をおこないます。この際、準備として、この拡張機能の GUID を作成する必要があるため、Visual Studio で [ツール] – [GUID の作成] を選択して、新しい GUID を作成しておきましょう。

レジストリーへの登録は、レジストリー エディター (regedit.exe) を開いて直接編集する方法や、Windows インストーラー (.msi) を作成してレジストリー設定をおこなう方法など、いろいろ考えられますが、今回は、サンプルとして、以下の .reg ファイルを作成して、これを実行します。(この際、下記の {95CF283C-708C-4D3C-BADF-06456ED07D60} の箇所には、前述で作成した GUID を設定します。)

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Communicator\ContextPackages\{95CF283C-708C-4D3C-BADF-06456ED07D60}]
"DefaultContextPackage"=dword:00000000
"ExtensibilityWindowSize"=dword:00000001
"ExternalURL"="http://kkdeveva01/CWESample1/CWESample1TestPage.html"
"InternalURL"="http://kkdeveva01/CWESample1/CWESample1TestPage.html"
"Name"="My Sample CWE Application"

なお、DefaultContextPackage は、Conversation Window 起動時に既定で表示するか否かを意味します。(1 にすると、Conversation Window 起動時に、既定でこの拡張画面が表示されます。)
また、ExtensibilityWindowSize は、以下の通り、画面サイズを意味しています。

0  small

1  medium

2  large

動作確認

では、動作を確認してみましょう。

まず、Lync クライアントで Conversation (IM) を開始して、Conversation Window を表示します。
この Conversation Window で、右上の [>>] のアイコンをクリックすると、ここに、登録された Conversation Window 拡張 (CWE) が拡張メニューとして追加されているのがわかります。(下図)

このメニューを選択すると、右側にカスタム アプリケーションのペインが表示されます。これで、上記のカスタム アプリケーションが右ペインで動作します。

補足 : コードを使った CWE の動的登録 (Run-Time Registration)

さいごに、補足として、プログラム コードを使った登録方法 (Run-Time Registration) についても記載しておきましょう。

以下は、別の Silverlight のアプリケーションから、上記の拡張機能 (CWE) を登録するサンプル コードです。

. . . 
using Microsoft.Lync.Model;
using Microsoft.Lync.Model.Extensibility;

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    LyncClient cl = LyncClient.GetClient();
    ApplicationRegistration reg = cl.CreateApplicationRegistration(
        "{95CF283C-708C-4D3C-BADF-06456ED07D60}",
        "My Sample CWE Application");
    reg.SetExtensibilityWindowProperties(
        @"http://kkdeveva01/CWESample1/CWESample1TestPage.html",
        @"http://kkdeveva01/CWESample1/CWESample1TestPage.html",
        ConversationWindowExtensionSize.Medium);
    reg.AddRegistration();
}

次回説明しますが、この登録された CWE を他のユーザーと共有したい場合には、対話をおこなう相手の側でもこの登録する必要があるという点に注意してください。
つまり、上記の通り、レジストリー登録も不要で、非常に簡単ですが、どのようなシナリオ (あるいは手順) でこの拡張機能を使わせるかといった点をちゃんと考えておく必要があります。(例えば、同じアプリケーションを開いていることが保証されている相手同士と対話する場合などでは、有効な手段です。)

ここでは簡単なサンプルを紹介しましたが、Lync SDK には、Bing Translator と連携して、外国人同士で翻訳をおこなって IM ができる Conversation Window Extension (CWE) のサンプル コードなども入っていますので、是非参考にしてみてください。

では、次回は、Conversation Window Extension を Contextual Conversation で連携させて、さらに強力なアプリケーション連携をおこなってみましょう。

 

Comments (0)

Skip to main content