きのこシステムは、ターゲットとなる「何か。」と通信できる構造になっています。
また、この構造をさらに外部のアプリケーションが利用することで、「何か。」ときのこの間にさらなる外部アプリケーションの介在の余地を与えます。
きのこの所有するFMOとMutexの構造はSAKURAや猫どりふとほぼ同一です。このため内部構造の詳細は割愛します。
FMOの名前は「Kinoko」、Mutexの名前は「kinoko」です。
きのこが生えていると、「何か。」のメインフォーム(Tmainformクラスのウィンドウ)には「KinokoProp」というウィンドウプロパティが設定されます。このウィンドウプロパティにはきのこのウィンドウハンドルが格納されます。ウィンドウプロパティは次のようにして取得します。
HWND hKinoko = (HWND)GetProp(hWnd, "KinokoProp");
きのこが存在しない場合は、上記コードを実行するとhKinokoにNULLが入ります。
きのこウィンドウはDirectSSTPサーバー機能を持ちます。現在受け付けるのはSEND/1.1のみで、スクリプトとしては\s、\wのみサポートです。
きのこ上で特定のイベントが発生すると、きのこから本体ウィンドウに通知メッセージが発行されます。このメッセージの値は次のようにして取得します。
UINT uKinokoNotifyMessage = RegisterWindowMessage("KinokoNotify");
このメッセージは次の場合に送信されます。
きのこが作成されると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は0です。
この時点で、次章で述べる「きのこの情報取得」が可能になっています。
きのこシステムをユーザーが終了し、きのこが破棄されると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は1です。
この時点でも、次章で述べる「きのこの情報取得」は可能です。
ユーザーがきのこスキンを切り替えると、切り替わりのため一端消える直前に、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は3です。
この時点では、次章で述べる「きのこの情報取得」では、切り替え前のスキンの情報が取得されます。
ユーザーがきのこスキンを切り替えると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、wParam は2です。
この時点で、次章で述べる「きのこの情報取得」では、切り替え後のスキンの情報が取得できるようになっています。
ユーザーがドラッグ&ドロップできのこスキンをインストールすると、ターゲットとなるウィンドウに通知メッセージが発行されます。この通知では、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 に記述していない場合は、結果として空文字列が格納されます。
想定ゴースト名称とカテゴリは、半角カンマで区切って複数指定されている場合があります。