Regnessemが提供するサービスを呼び出してメッセージを送信します。
サービスの呼び出しは次の手順に基づいて行います。
GetService
関数を使ってサービスハンドルを得る。WPARAM
, LPARAM
に渡す引数を用意する。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)
}
今回の変更点は少ないので、前回から変更のあった部分だけを示します。
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
構造体は表示するメッセージの属性を定義します。メンバには次のものが含まれます。
lpFontName
)nCharSet
)nFontSize
)nFontColor
)nBgColor
)nStyles
)フォント名はTahomaやMS P ゴシックといったフォント名を指定します。文字セットには表示に用いる文字セットを指定します。例えばANSI_CHARSET
やSHIFTJIS_CHARSET
です。これらはwingdi.hに定義されています。フォントサイズはポイント指定のサイズを指定します。
フォント色や背景色を指定するnFontColor
とnBgColor
には0x000000
(黒)~0xFFFFFF
(白)が指定できます。この並びは0xBBGGRR
です。上から1バイトずつ順に青、緑、赤の並びです。
nStyles
には書式をセットします。書式は以下のものが定義されています。
NMFS_BOLD
)NMFS_ITALIC
)NMFS_UNDERLINE
)NMFS_STRIKEOUT
)今回は受信したメッセージの属性をそのまま利用することにします。
TMessageInfo
構造体は、送信するメッセージそのものを定義した構造体です。メンバには次のものがあります。
lpFrom
)lpBody
)TTextAttributeInfo
構造体へのポインタ (lpTextAttribute
)nFlags
)今回は送信なので、lpFrom
にはNULL
、lpBody
には送信するワイド文字列(UTF-16)、lpTextAttribute
には先ほど用意したものを使います。
最後にCallService
関数を使ってサービスを呼び出します。第一引数にはサービスハンドル、第二引数にはこのメッセージを受信したセッションのハンドル、第三引数にはTMessageInfo
構造体へのポインタを渡します。それぞれWPARAM
とLPARAM
にキャストしておきます。