본문 바로가기

Application Programming Interface/Windows API

Windows DDK 문서 IMEIMES.DOC - 4. Generating Messages(메시지 생성하기)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

IME 개발을 위한 Win32 다국어 IME 개요

버전 1.32
최종 수정일: 1998년 4월 1일, 번역: Luciano Jeong


메시지 생성하기

 IME는 IME 메시지를 생성해야 합니다. IME가 변환 과정을 시작할 때 IME는 WM_IME_STARTCOMPOSITION 메시지를 생성합니다. 만일 IME가 조합 문자열을 변경할 때는 WM_IME_COMPOSITION 메시지를 생성합니다.

 IME가 메시지를 생성하는 방법에는 두 가지가 있습니다. 하나는 ImeToAsciiEx가 제공하는 lpdwTransKey 버퍼를 사용하는 방법이 있고 다른 하나는 ImmGenerateMessage 함수를 호출하는 방법입니다.

메시지를 생성하기 위해 lpdwTransBuf를 사용하기

 IME가 초기화하는 이벤트는 입력 컨텍스트에 연결된 윈도우를 위한 메시지 생성으로 인식됩니다. 기본적으로 IME는 메시지를 생성하기 위해 ImeToAsciiEx 함수의 매개변수로 전달되는 lpdwTransKey 버퍼를 사용합니다. IME는 ImeToAsciiEx 함수가 호출될 때 이 lpdwTransKey 버퍼에 메시지를 추가합니다.

 ImeToAsciiEx 함수 내에서 lpdwTransBuf로 명시되는 이 버퍼는 시스템에 제공됩니다. 이 함수는 이 버퍼에 메시지를 둘 수 있습니다. 단, 한 번에 하나씩만 가능합니다. 이 버퍼에 둘 수 있는 메시지의 실제 숫자는 버퍼의 처음 DWORD입니다. 그러나 ImeToAsciiEx 함수가 메시지를 더 발생하고 싶다면 ImeToAsciiEx 함수는 모든 메시지를 입력 컨텍스트의 hMsgBuf에 둘 수 있으며 생성하고 싶은 메시지의 개수를 반환하면 됩니다.

 ImeToAsciiEx의 반환 값이 lpdwTransBuf에서 명시한 값보다 크면 시스템은 lpdwTransBuf의 값을 고려하지 않습니다. 대신 시스템은 ImeToAsciiEx의 매개변수로 전달했던 입력 컨텍스트의 hMsgBuf 핸들을 참조합니다.

 아래 예제는 ImeToAsciiEx 함수를 구현한 예입니다.

/* 사용 예 */
UINT ImeToAsciiEx(uVirKey, uScanCode, lpbKeyState, lpdwTransBuf, fuState, hIMC)
{
	DWORD dwMyNumMsg = 0;
 
	// 생략
 
	// Set the messages that the IME wants to generate.
	// IME가 생성하고자하는 메시지를 설정합니다.
	*lpdwTransBuf++ = (DWORD)msg;
	*lpdwTransBuf++ = (DWORD)wParam;
	*lpdwTransBuf++ = (DWORD)lParam;
 
	// Count the number of the messages that the IME wants to generate.
	// IME가 생성하고자 하는 메시지의 수를 증가시킵니다.
	dwMyNumMsg++;
 
	return dwMyNumMsg;
}

메시지 버퍼를 사용하여 메시지를 생성하기

 ImeToAsciiEx가 호출되지 않아도 IME는 입력 컨텍스트가 갖는 메시지 버퍼를 사용하여 입력 컨텍스트와 연결된 윈도우에 여전히 메시지를 생성할 수 있습니다. 이 메시지 버퍼는 메모리 블록의 핸들로 작동됩니다. 그리고 IME는 이 메모리 블록에 메시지를 추가합니다. IME는 그 다음 ImmGenerateMessage 함수를 호출합니다. 이 함수는 적당한 윈도우에 메시지 버퍼에 담긴 메시지를 전달합니다.

 아래 예는 ImmGenerateMessage 함수를 구현한 예제 코드입니다.

/* 사용 예 */
MyGenerateMesage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAMlParam)
{
	LPINPUTCONTEXT lpIMC;
	HGLOBAL hTemp;
	LPDWORD lpdwMsgBuf;
	DWORD dwMyNumMsg = 1;
    
	// Lock the Input Context.
	// 입력 컨텍스트 핸들을 잠그기
	lpIMC = ImmLockIMC(hIMC);

	if (!lpIMC)
	// Error! (오류라면)
	// re-allocate the memory block for the message buffer. (메시지 버퍼의 메모리 블록을 재할당)
		hTemp = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + dwMyNumMsg) * sizeof(DWORD) * 3);

	if (!hTemp)
	// Error! (그래도 오류 시)
		lpIMC->hMsgBuf = hTemp;

	// Lock the memory for the message buffer.
	// 메시지 버퍼의 메모리 핸들을 잠가 포인터를 얻기
		lpdwMsgBuf = ImmLockIMCC(lpIMC->hMsgBuf);

	if (!lpdwMsgBuf)
	// Error!
	// 오류 시
		lpdwNumMsgBuf += 3 * lpIMC->dwNumMsgBuf.

	// Set the number of the messages.
	// 메시지의 수를 설정하기
		lpIMC->dwNumMsgBuf += dwMyNumMsg;
 
	// Set the messages that the IME wants to generate.
	// IME가 생성을 원하는 메시지를 설정하기
	*lpdwMsgBuf++ = (DWORD)msg;
	*lpdwMsgBuf++ = (DWORD)wParam;
	*lpdwMsgBuf++ = (DWORD)lParam;
 
	// Unlock the memory for the message buffer and the Input Context.
	// 입력 컨텍스트와 메시지 버퍼 메모리 블록을 잠금 해제하기
	ImmUnlockIMCC(lpIMC->hMsgBuf);
	ImmLockIMC(hIMC);
 
	// Call ImmGenerateMessage function.
	// ImmGenerateMessage 함수 호출하기
	ImmGenerateMessage(hIMC);
}

WM_IME_COMPOSITION 메시지

 IME가 WM_IME_COMPOSITION 메시지를 생성하면, IME는 lParam으로 GCS 비트를 설정합니다. GCS 비트는 COMPOSITIONSTRING 구조체에서 사용 가능한 멤버가 무엇인지를 알려줍니다. IME가 업데이트되지 않고 멤버가 사용가능하다 해도 IME는 GCS 비트를 설정할 수 있습니다.

 IME가 WM_IME_COMPOSITION 메시지를 생성할 때, IME는 문자열 속성과 절(clause) 정보를 한번에 수정할 수 있습니다.