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にキャストしておきます。