きのこ開発インターフェース

きのこシステムは、ターゲットとなる「何か。」と通信できる構造になっています。

また、この構造をさらに外部のアプリケーションが利用することで、「何か。」ときのこの間にさらなる外部アプリケーションの介在の余地を与えます。

きのこの存在確認およびきのこウィンドウの取得

FileMappingとMutexによる確認 Phase4.00〜

きのこの所有するFMOとMutexの構造はSAKURAや猫どりふとほぼ同一です。このため内部構造の詳細は割愛します。

FMOの名前は「Kinoko」、Mutexの名前は「kinoko」です。

本体プログラム側からのきのこの存在確認

きのこが生えていると、「何か。」のメインフォーム(Tmainformクラスのウィンドウ)には「KinokoProp」というウィンドウプロパティが設定されます。このウィンドウプロパティにはきのこのウィンドウハンドルが格納されます。ウィンドウプロパティは次のようにして取得します。

HWND hKinoko = (HWND)GetProp(hWnd, "KinokoProp");

きのこが存在しない場合は、上記コードを実行するとhKinokoにNULLが入ります。

DirectSSTP

きのこウィンドウはDirectSSTPサーバー機能を持ちます。現在受け付けるのはSEND/1.1のみで、スクリプトとしては\s、\wのみサポートです。

きのこからの通知メッセージ

きのこ上で特定のイベントが発生すると、きのこから本体ウィンドウに通知メッセージが発行されます。このメッセージの値は次のようにして取得します。

UINT uKinokoNotifyMessage = RegisterWindowMessage("KinokoNotify");

このメッセージは次の場合に送信されます。

本体にきのこが生えた場合

きのこが作成されると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は0です。

この時点で、次章で述べる「きのこの情報取得」が可能になっています。

きのこが削除された場合

きのこシステムをユーザーが終了し、きのこが破棄されると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は1です。

この時点でも、次章で述べる「きのこの情報取得」は可能です。

ユーザーがきのこスキンを切り替えた場合(事前)

ユーザーがきのこスキンを切り替えると、切り替わりのため一端消える直前に、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は3です。

この時点では、次章で述べる「きのこの情報取得」では、切り替え前のスキンの情報が取得されます。

ユーザーがきのこスキンを切り替えた場合(事後)

ユーザーがきのこスキンを切り替えると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は2です。

この時点で、次章で述べる「きのこの情報取得」では、切り替え後のスキンの情報が取得できるようになっています。

ユーザーがD&Dにてきのこスキンをインストールした場合 ※Phase2.00〜

ユーザーがドラッグ&ドロップできのこスキンをインストールすると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は4です。

きのこの情報取得

きのこの情報を取得するためには、上記のウィンドウプロパティを利用してきのこのウィンドウハンドルを取得してください。

きのこのウィンドウハンドルに次のようなコードを用いてメッセージを送信することで、きのこから情報を取得することができます。

以下にメッセージの定義とサンプルコードを載せます。

メッセージの wParam には、GetCurrentProcessId() API の戻り値をそのまま指定します。

メッセージの lParam には、最低200バイトを確保した char のポインタを指定します。

このメッセージは外部のプロセスからも送信できます。

現在生えているきのこスキンの名称

#define WM_KINOKO_GETKINOKONAME (WM_APP+101)

BOOL bSuccess;
char szKinokoName[200];

szKinokoName[0] = '\0';
bSuccess = (BOOL)SendMessage(hKinoko, WM_KINOKO_GETKINOKONAME, 
    (WPARAM)GetCurrentProcessId(), (LPARAM)szKinokoName);

現在生えているきのこスキンが主に想定しているゴースト名称

#define WM_KINOKO_GETGHOSTNAME (WM_APP+102)

BOOL bSuccess;
char szKinokoName[200];

szKinokoName[0] = '\0';
bSuccess = (BOOL)SendMessage(hKinoko, WM_KINOKO_GETKINOKONAME, 
    (WPARAM)GetCurrentProcessId(), (LPARAM)szKinokoName);

現在生えているきのこスキンのカテゴリ名称

#define WM_KINOKO_GETCATEGORY (WM_APP+103)

BOOL bSuccess;
char szKinokoName[200];

szKinokoName[0] = '\0';
bSuccess = (BOOL)SendMessage(hKinoko, WM_KINOKO_GETKINOKONAME, 
    (WPARAM)GetCurrentProcessId(), (LPARAM)szKinokoName);

それぞれのメッセージはBOOL値を返し、TRUEが成功、FALSEが失敗です。

また、スキンデータがそれぞれの情報を kinoko.ini に記述していない場合は、結果として空文字列が格納されます。

想定ゴースト名称とカテゴリは、半角カンマで区切って複数指定されている場合があります。