ImmGetCompositionString 変換中の文字列の情報を取得

Cの宣言:

LONG ImmGetCompositionString(
	HIMC hIMC,
	DWORD InfoType,
	LPVOID Buf,
	DWORD BufSize);

説明:

現在IMEを使用して入力されている文字列の情報を取得する。

引数の意味は、以下の通り。
hIMC (IN) 情報の取得元の入力コンテキストを示すハンドル
InfoType (IN) どのような情報を取得するかを識別するフラグ。後述の表を参照。
Buf (OUT) 取得した情報を格納するためのバッファ。
BufSize (OUT) Bufのサイズ。0を指定した場合、戻り値に必要なサイズが返される。

InfoTypeに指定可能な値は、以下のいずれかのフラグである。
GCR_ERRORSTR 不明。
GCR_INFORMATIONSTR 不明。
GCS_COMPATTR 入力されている文字列中の各バイト値の属性を表す8bit整数フラグの配列がbufに返される。すなわち、2バイト文字の第二バイトの属性情報も返される。戻り値は、配列の要素数。返される値の意味は、後述の表を参照。
GCS_COMPCLAUSE 各文節の位置をバイト単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力されている文字列長をバイト数で表した値が格納される。戻り値は配列のバイトサイズ。
GCS_COMPREADATTR 変換途中の文字列中の各文字の属性を示す8bit整数のフラグの配列が、bufに返される。戻り値は、配列のバイトサイズ。返される値の意味は、後述の表を参照。
GCS_COMPREADCLAUSE 各文節の位置を文字数で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力されている文字列長を文字数で表した値が格納される。戻り値は配列のバイトサイズ。
GCS_COMPREADSTR 入力された文字列を1バイトカタカナで表した文字列をbufに返す。戻り値は、文字列のバイトサイズ。
GCS_COMPSTR 入力されている文字列をbufに返す。戻り値は、文字列のバイトサイズ。
GCS_CURSORPOS 戻り値は、現在のカーソル位置。
GCS_DELTASTART 戻り値は、最後に変更がされた文字列の先頭位置。
GCS_RESULTCLAUSE 最後に変換を行った際の各文節の位置をバイト単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力された文字列長をバイト数で表した値が格納される。戻り値は、配列のバイトサイズ。
GCS_RESULTREADCLAUSE 最後に変換を行った際の各文節の位置を文字単位で表す、32bit整数のオフセット値の配列が、bufに返される。ただし、配列の末尾に、入力された文字列長を文字数で表した値が格納される。戻り値は、配列のバイトサイズ。
GCS_RESULTREADSTR 最後に変換を行った際に入力された文字列を1バイトカタカナで表した文字列をbufに返す。戻り値は、文字列のバイトサイズ。
GCS_RESULTSTR 最後に変換を行った際の変換結果の文字列をbufに返す。戻り値は、文字列のバイトサイズ。
GCS_TYPINGINFO ユーザが入力した生の文字列をbufに返す。ローマ字入力ならば、入力した英字の列が返されるだろう。

GCS_COMPATTR及びGCS_COMPREADATTRを指定した際に返される配列中の各値の意味は、以下の通り。
ATTR_INPUT 選択されていなく、変換されていない文字。
ATTR_TARGET_CONVERTED 選択されていて、変換されている文字。
ATTR_CONVERTED 選択されてなく、変換されている文字。
ATTR_TARGET_NOTCONVERTED 選択されていて、変換されていない文字。
ATTR_INPUT_ERROR 無効な文字。

GCS_RESULTREADSTRなどで返される情報は、変換を終了してから、再び文字列の入力を開始するまでの間のみ有効な情報が返される。再び入力を開始したならば、サイズ0の情報が返される。文節に関する情報は、次の変換実行までの間有効となる。

bufに文字列が返されるとき、この文字列がNULL文字で終わるとは限らない。従って、bufに返された文字列の長さを戻り値によって判定しなければならない。

関数の実行に成功した場合、InfoTypeに応じた戻り値が返される。BufSizeに0を指定した場合、必要なサイズが返される。エラーが発生した場合、以下のエラーが返される。
IMM_ERROR_NODATA 入力コンテキストの準備ができていない。
IMM_ERROR_GENERAL 何らかのエラーが発生した。

文字列情報取得のサンプル(C言語):

#define INFONUM 4
#define BUFMAX 1000

void DispCompStrInfo(hDispWnd, hTargetWnd)
HWND hDispWnd; /* 情報を表示するウィンドウ */
HWND hTargetWnd; /* 情報を取得するウィンドウ */
{
	HIMC hImc;
	char InfoResult[BUFMAX], InfoMsg[BUFMAX];
	LONG RetSize;
	HDC hDC;
	RECT r;
	int i;

	DWORD InfoType[INFONUM] = {
		GCS_COMPREADSTR, 
		GCS_COMPSTR, 
		GCS_RESULTSTR, 
		GCS_RESULTREADSTR, 
	};
	
	char *InfoTitle[INFONUM] = {
		"入力されている文字列の1バイトカタカナによる表現",
		"入力されている文字列", 
		"最後に変換した際の変換結果",
		"最後に変換した際の変換結果の1バイトカタカナによる表現",
	};

	/* 表示領域の初期化 */
	hDC = GetDC(hDispWnd);
	GetClientRect(hDispWnd, &r);
	FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH));

	/* 入力コンテキストの取得 */
	hImc = ImmGetContext(hTargetWnd);

	/* 文字列情報 */
	for(i=0; i<INFONUM; i++) {
		/* 情報の取得 */
		RetSize = ImmGetCompositionString(hImc, InfoType[i], InfoResult, BUFMAX);
		InfoResult[RetSize] = '\0';

		/* 情報の表示 */
		wsprintf(InfoMsg, "%s: %s", InfoTitle[i], InfoResult);
		TextOut(hDC, 0, i*20, InfoMsg, lstrlen(InfoMsg));
	}

	/* 入力コンテキストの解放 */
	ImmReleaseContext(hTargetWnd, hImc);

	/* 後処理 */
	ReleaseDC(hDispWnd, hDC);
}

文節情報取得のサンプル(C言語):

#define BUFMAX 1000
#define INFONUM 4

void DispCompClauseInfo(hDispWnd, hTargetWnd)
HWND hDispWnd; /* 情報を表示するウィンドウ */
HWND hTargetWnd; /* 情報を取得するウィンドウ */
{
	HIMC hImc;
	DWORD ClauseOffset[BUFMAX];
	char InfoMsg[BUFMAX];
	LONG ClauseNum, j;
	HDC hDC;
	RECT r;
	int i, y = 0;

	DWORD InfoType[INFONUM] = {
		GCS_COMPCLAUSE,
		GCS_COMPREADCLAUSE,
		GCS_RESULTCLAUSE,
		GCS_RESULTREADCLAUSE
	};
	
	char *InfoTitle[INFONUM] = {
		"入力されている文字列のバイト単位の文節位置及び文字列サイズ:",
		"入力されている文字列の文字単位の文節位置及び文字列サイズ:", 
		"最後に変換した際の変換結果のバイト単位の文節位置および文字列サイズ:",
		"最後に変換した際の変換結果の文字単位の文節位置および文字列サイズ:",
	};

	/* 表示領域の初期化 */
	hDC = GetDC(hDispWnd);
	GetClientRect(hDispWnd, &r);
	FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH));

	/* 入力コンテキストの取得 */
	hImc = ImmGetContext(hTargetWnd);

	/* 文字列情報 */
	for(i=0; i<INFONUM; i++) {
		/* タイトルの表示 */
		TextOut(hDC, 0, (y++)*20, InfoTitle[i], lstrlen(InfoTitle[i]));
		
		/* 情報の取得 */
		ClauseNum = ImmGetCompositionString(hImc, InfoType[i], ClauseOffset, BUFMAX);
		ClauseNum = ClauseNum / sizeof(DWORD); /* バイトサイズを配列の要素数に変換 */

		/* 情報の表示 */
		for(j=0; j<ClauseNum; j++) {
			if(j < ClauseNum-1) { /* j番目の文節の位置を表示 */
				wsprintf(InfoMsg, "    %d番目の文節: %d", j+1, ClauseOffset[j]);
				TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg));

			} else { /* 末尾の配列要素の場合、総計を表す */
				wsprintf(InfoMsg, "    総計: %d", ClauseOffset[ClauseNum-1]);
				TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg));
			}
		}
	}

	/* 入力コンテキストの解放 */
	ImmReleaseContext(hTargetWnd, hImc);

	/* 後処理 */
	ReleaseDC(hDispWnd, hDC);
}


文字属性取得のサンプル(C言語):

#define BUFMAX 1000
#define INFONUM 2

void DispCompCharAttr(hDispWnd, hTargetWnd)
HWND hDispWnd; /* 情報を表示するウィンドウ */
HWND hTargetWnd; /* 情報を取得するウィンドウ */
{
	HIMC hImc;
	BYTE CharAttr[BUFMAX];
	char InfoMsg[BUFMAX], *AttrMsg;
	LONG CharNum, j;
	HDC hDC;
	RECT r;
	int i, y = 0;

	DWORD InfoType[INFONUM] = {
		GCS_COMPREADATTR,
		GCS_COMPATTR,
	};
	
	char *InfoTitle[INFONUM] = {
		"変換途中の文字列の文字単位での属性:",
		"入力されている文字列のバイト単位での属性:"
	};

	/* 表示領域の初期化 */
	hDC = GetDC(hDispWnd);
	GetClientRect(hDispWnd, &r);
	FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH));

	/* 入力コンテキストの取得 */
	hImc = ImmGetContext(hTargetWnd);

	/* 文字列情報 */
	for(i=0; i<INFONUM; i++) {
		/* タイトルの表示 */
		TextOut(hDC, 0, (y++)*20, InfoTitle[i], lstrlen(InfoTitle[i]));
		
		/* 情報の取得 */
		CharNum = ImmGetCompositionString(hImc, InfoType[i], CharAttr, BUFMAX);

		for(j=0; j<CharNum; j++) {
			/* 文字属性のメッセージ設定 */
			switch(CharAttr[j]) {
				case ATTR_INPUT: 
					AttrMsg = "選択されていなく、変換されていない文字"; 
					break;
				case ATTR_TARGET_CONVERTED:
					AttrMsg = "選択されていて、変換されている文字";
					break;
				case ATTR_CONVERTED:
					AttrMsg = "選択されていなく、変換されている文字";
					break;
				case ATTR_TARGET_NOTCONVERTED:
					AttrMsg = "選択されていて、変換されていない文字";
					break;
				case ATTR_INPUT_ERROR:
					AttrMsg = "無効な文字";
				break;
			}
			
			/* 情報表示 */
			wsprintf(InfoMsg, "    %d番目の文字: %s", j+1, AttrMsg);
			TextOut(hDC, 0, (y++)*20, InfoMsg, lstrlen(InfoMsg));
		}
	}

	/* 入力コンテキストの解放 */
	ImmReleaseContext(hTargetWnd, hImc);

	/* 後処理 */
	ReleaseDC(hDispWnd, hDC);
}

カーソル位置取得のサンプル(C言語):

void DispCompCursorPos(hDispWnd, hTargetWnd)
HWND hDispWnd; /* 情報を表示するウィンドウ */
HWND hTargetWnd; /* 情報を取得するウィンドウ */
{
	HIMC hImc;
	char InfoMsg[BUFMAX];
	LONG CursorPos;
	HDC hDC;
	RECT r;

	/* 表示領域の初期化 */
	hDC = GetDC(hDispWnd);
	GetClientRect(hDispWnd, &r);
	FillRect(hDC, &r, (HBRUSH)GetStockObject(DKGRAY_BRUSH));

	/* 入力コンテキストの取得 */
	hImc = ImmGetContext(hTargetWnd);

	/* カーソル位置取得 */
	CursorPos = ImmGetCompositionString(hImc, GCS_CURSORPOS, NULL, 0);

	/* カーソル位置表示 */	
	wsprintf(InfoMsg, "    カーソル位置: %d", CursorPos);
	TextOut(hDC, 0, 0, InfoMsg, lstrlen(InfoMsg));

	/* 入力コンテキストの解放 */
	ImmReleaseContext(hTargetWnd, hImc);

	/* 後処理 */
	ReleaseDC(hDispWnd, hDC);
}

メモ:

GCS_DELTASTARTの挙動が不明。

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。