サービスを呼び出す

Regnessemが提供するサービスを呼び出してメッセージを送信します。

サービス呼び出しの基本

サービスの呼び出しは次の手順に基づいて行います。

  1. GetService関数を使ってサービスハンドルを得る。
  2. 取得したサービスハンドルが真であるかを確認する。
  3. WPARAM, LPARAMに渡す引数を用意する。
  4. CallService関数を使ってサービスを呼び出す。

    HNsmService hService = PluginInitInfo.CallService(Service Name); // (1)
    if (hService) {  // (2)
        WPARAM wParam; // wParamを用意 (3-A)
        LPARAM lParam; // lParamを用意 (3-B)
        PluginInitInfo.CallService(hService, wParam, lParam); // (4)
    }
  

aam.d

今回の変更点は少ないので、前回から変更のあった部分だけを示します。


    extern (Windows)
    int OnReceiveMessage(WPARAM wParam, LPARAM lParam)
    {
        HNsmSession  hSession  = cast(HNsmSession)  wParam;
        PMessageInfo lpMesInfo = cast(PMessageInfo) lParam;
        
        if (MenuStatus) {
            HNsmService hService = PluginInitInfo.GetService(toStringz(NMS_SYSTEM_SESSION_SENDMESSAGE));
            if (hService) {
                TTextAttributeInfo textattr;
                textattr.cbSize     = TTextAttributeInfo.sizeof;
                textattr.lpFontName = lpMesInfo.lpTextAttribute.lpFontName;
                textattr.nCharSet   = lpMesInfo.lpTextAttribute.nCharSet;
                textattr.nFontSize  = lpMesInfo.lpTextAttribute.nFontSize;
                textattr.nFontColor = lpMesInfo.lpTextAttribute.nFontColor;
                textattr.nBgColor   = lpMesInfo.lpTextAttribute.nBgColor;
                textattr.nStyles    = lpMesInfo.lpTextAttribute.nStyles;
                
                TMessageInfo mesinfo;
                mesinfo.cbSize          = TMessageInfo.sizeof;
                mesinfo.lpFrom          = null;
                mesinfo.lpBody          = toWStringz("ただいま留守にしています。ご用のある方はメッセージをどうぞ。");
                mesinfo.lpTextAttribute = &textattr;
                
                PluginInitInfo.CallService(hService, cast(WPARAM) hSession, cast(LPARAM) &mesinfo);
            }
        }
        
        return 0;
    }
  

目的のプラグインにするには、メッセージを受信したときに留守であるメッセージを送信すれば要求は満たされます。そこで受信メッセージイベントをフックしたOnReceivedMessage関数内でメッセージを送信すればいいということになります。

まずサービスハンドルを取得します。GetService関数にサービス名を渡すとサービスハンドルを返します。失敗した場合は0(偽)を返すので、次のifが成立するのはサービスハンドルが正常に取得できたときです。

System/Session/SendMessageサービスの引数を確認するとwParamにはHNsmSession(セッションハンドル)、lParamにはTMessageInfo構造体へのポインタを渡すとあります。そこでまずTMessageInfoを用意します。TMessageInfoにはTTextAttributeInfo構造体へのポインタを含むので、先にTTextAttributeInfoを用意します。

TTextAttributeInfo構造体は表示するメッセージの属性を定義します。メンバには次のものが含まれます。

フォント名はTahomaやMS P ゴシックといったフォント名を指定します。文字セットには表示に用いる文字セットを指定します。例えばANSI_CHARSETSHIFTJIS_CHARSETです。これらはwingdi.hに定義されています。フォントサイズはポイント指定のサイズを指定します。

フォント色や背景色を指定するnFontColornBgColorには0x000000(黒)~0xFFFFFF(白)が指定できます。この並びは0xBBGGRRです。上から1バイトずつ順に青、緑、赤の並びです。

nStylesには書式をセットします。書式は以下のものが定義されています。

今回は受信したメッセージの属性をそのまま利用することにします。

TMessageInfo構造体は、送信するメッセージそのものを定義した構造体です。メンバには次のものがあります。

今回は送信なので、lpFromにはNULLlpBodyには送信するワイド文字列(UTF-16)、lpTextAttributeには先ほど用意したものを使います。

最後にCallService関数を使ってサービスを呼び出します。第一引数にはサービスハンドル、第二引数にはこのメッセージを受信したセッションのハンドル、第三引数にはTMessageInfo構造体へのポインタを渡します。それぞれWPARAMLPARAMにキャストしておきます。

Download

参考リンク

Copyright © 2004 Moon moon@users.sourceforge.jp