S-JIS[2006-07-30]

Beckyプラグインの作成方法

メールソフトのBecky!2では、プラグインの作成方法が公開されています。C++が基本だけど、delphi用のライブラリもあるみたい。
ここでは、VC++を使って作る例をメモしておきます。


事前準備

  1. Beck!のページ(「開発者向け」の項)から、 「Becky! Plug-In SDK」(B2PinSDK-22400.zip)をダウンロードしてくる。
  2. SDKのヘルプは英語なので、日本語のヘルプもダウンロードしておくと便利。
  3. VC++のプロジェクト用ディレクトリに「BeckyPlugInSDK」(名前は何でもいいけど)というディレクトリを作る。
  4. SDKのアーカイブにある以下のファイルをBeckyPlugInSDKディレクトリにコピーする。

開発作業

  1. BeckyPlugInSDKディレクトリの下にVC++のDLLの新規プロジェクトを作成する。 (DllMainは不要)
  2. SDKのアーカイブにあるTemplate.cppを(例えばSample.cppとかに変えて)、プロジェクトのディレクトリにコピーする。
  3. Sample.cpp内のBKC_OnPlugInInfo関数のコメントを外し、自分のプラグインの名前や作成者の名前に置き換える。
    szPlugInName プラグインの名前。メニューバーとかに表示される。
    szVendor 作成者の名前。
    szVersion バージョン。
    szDescription 説明。
  4. SDKのアーカイブにあるTemplate.defを(例えばSample.defとかに変えて)、プロジェクトのディレクトリにコピーする。
  5. Sample.defをプロジェクトへ追加する。
  6. プロジェクト内から1つ上のディレクトリに在るBeckyAPI.cppプロジェクトへ追加する。(必要であればBkCommon.cpp追加する)
  7. コーディングする。
    Beckyから呼ばれるコールバック関数(BKC_Onなんちゃら)が色々あるので、自分がやりたい事に適した関数を探して その中身をコーディングすることになる。どんなものがあるかはヘルプ参照。
  8. ビルド(コンパイル・リンク)する。
  9. 生成されたDLLを Beckyのプラグインのディレクトリにコピーする。(カスタムビルドの定義をしておくと自動化できる)

テスト・動作

  1. Beckyを起動する。
    作成したプラグイン(DLL)を初めて入れたときには、「プラグインのインストール」ダイアログが出る。次回以降の起動ではインストールダイアログは出なくなる。
    キャンセルボタンを押してインストールしなかった場合は、以下の手順で使用できるようになる。
    1. メニューバーの「ツール(T)」→「全般的な設定(G)」で「全般的な設定」ダイアログを開く。
    2. 「高度」タブを選択する。
    3. 「プラグイン(P)」ボタンを押して「プラグインの選択」ダイアログを開く。
    4. 自分のプラグイン(DLL)にチェックを入れる。(外すと使えなくなる)

設定ダイアログ

Beckyでメニューバーの「ツール(T)」→「プラグインの設定(U)」→「自分のプラグイン名」でプラグインを選択したときに、設定ダイアログが出るとかっこいい(笑)
BKC_OnPlugInSetup関数内でダイアログが出るようにコーディングしておく。

int WINAPI BKC_OnPlugInSetup(HWND hWnd)
{
	int nRC = DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_SETTING), hWnd, (DLGPROC)SetupProc);
	return 1;
}

メニューの加工

Beckyのメニューバーにメニューを追加することが出来る。
メニューが表示されるとき、BKC_OnMenuInit関数が呼ばれる。ここで、Win32APIのメニュー関連関数を使ってメニューを加工できる。

int WINAPI BKC_OnMenuInit(HWND hWnd, HMENU hMenu, int nType)
{
	switch (nType) {
	case BKC_MENU_MAIN:
		{
			HMENU hSubMenu = GetSubMenu(hMenu, 3);
			// Define CmdProc as "void WINAPI CmdProc(HWND, LPARAM)"
			UINT nID = bka.RegisterCommand("ステータスバーに表示される説明", nType, CmdProc);
			InsertMenu(hSubMenu, 22, MF_BYPOSITION | MF_STRING, nID, "メニューバーに出すメッセージ");

			// Define CmdUIProc as "UINT WINAPI CmdUIProc(HWND, LPARAM)"
			bka.RegisterUICallback(nID, CmdUIProc);
		}
		break;
〜
	default:
		break;
	}
	// Always return 0.
	return 0;
}
メニューの番号
0 「ファイル(F)」
1 「編集(E)」
2 「表示(V)」
3 「メール(M)」
4 「ツール(T)」
5 「ヘルプ(H)」

メニューの加工方法についてはMFCのCMenuの使い方が参考になる。(あくまで「参考」。例えばBeckyプラグインでは、メニューの変更時に削除は必要ない)
ただ 気になるのは、Beckyのメニュー構成がこのままであるという保証が無い(と思われる)こと。
自分以外のプラグインもメニューを変えられるわけで、その辺りのバッティングに関しての指針とか、どこかにあるのかなぁ…?


メニューにチェックを付けたり選択不可にしたりしたい場合は、UIのコールバック関数を用意してRegisterUICallbackによって登録する。

UINT WINAPI CmdUIProc(HWND hWnd, LPARAM lParam)
{
	UINT ret = 0;
	ret |= BKMENU_CMDUI_DISABLED;	//使用不可にする
	ret |= BKMENU_CMDUI_CHECKED;	//チェックを付ける
	return ret;
}

メニューが実際に選択されたときに呼ばれるコールバック関数を用意して、RegisterCommandによって登録する。

void WINAPI CmdProc(HWND hWnd, LPARAM lParam)
{
	//メニューが選択された時の動作をプログラミング
}

ツールのページへ行く / トップページへ行く
メールの送信先:ひしだま