IME
먼저 IME를 사용하려면 프로젝트에 Imm32.lib를 추가하고, imm.h를 인클루드 해야한다.
IME 메시지
WM_IME_STARTCOMPOSITION
IME가 조립 문자열을 만들기 직전에 보냄. WPARAM, LPARAM의 값은 없음. 이 메시지를 DefWindowProc으로
보내지 않으면 조립윈도우가 나타나지 않는다.
WM_IME_ENDCOMPOSITION
조립이 끝났다는 통지 메시지. 인수와 리턴값 없음. 커스텀 IME 윈도우를 작성하지 않는다면 무시해도 무방함.
WM_IME_COMPOSITION
조립 상태가 변경될때마다 보내진다.
WPARAM - 조립중의 문자의 코드가 전달, 이 코드는 2byte의 DBCS문자로 조립중인 중간 문자코드이다.
LPARAM - 조립상태가 어떻게 변경되었는지, 이 문자를 어떻게 처리해야 하는지를 나타내는 플래그의 집합.
한글의 경우 다음 두 플래그가 특히 중요함.
GCS_COMPSTR : 아직 문자를 조립중이라는 뜻, 즉 아직 한 음절이 완성되지는 않았음.
GCS_RESULTSTR : 한 음절을 완전히 조립했다는 뜻.
이 플래그들이 있는지 살펴보면 문자가 완성된 것인지, 조립중인지 알 수 있음.
WM_IME_CHAR
문자 하나가 완성되었을때 보내짐.
WPARAM - 완성된 문자의 코드가 전달. 1byte만 전달되는 WM_CHAR과는 달리 DBCS일 수 있음.
(단, 유니코드 윈도우에서는 WM_CHAR, WM_IME_CHAR 모두 2byte이다.)
이 메시지를 무시하면 한글 한 문자에 대해 WM_CHAR 메시지를 두번 받게 된다.
WM_IME_SETCONTEXT
응용프로그램이 활성/비활성화될 때 보내진다. WPARAM이 TRUE이면 활성, FALSE이면 비활성화 되었다는 뜻이다.
WM_IME_NOTIFY
IME 윈도우가 변경되었다는 통지 메시지이다. WPARAM으로 어떤 변경인지 통보됨.한글 입력, 영문 입력모드를
변경할 때도 이 메시지가 전달된다.
Input Context 생성, 해제
Input Context(입력 컨텍스트) : IME가 내부적으로 사용하는 구조체이며 조립 문자열, 변환모드, IME 윈도우의 위치 등 IME의 현재 상태에 대한 정보들이 저장됨.
Input Context의 핸들을 얻는 함수
HIMC ImmGetContext(void);
BOOL ImmReleaseContext(HWND hWnd, HIMC hIMC);
Input Context를 조작하는 함수
BOOL ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence);
BOOL ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence);
ImmSetConversionStatus(hImc, IME_CMODE_NATIVE, IME_SMODE_NONE);
입력모드를 영어로 변환하고 싶으면
ImmSetConversionStatus(hImc, 0, IME_SMODE_NONE);
하지만 시스템이 만드는 Default Input Context는 스레드 내의 모든 윈도우가 공유하기 때문에 한글이나 영문으로 변경시
모든 입력모드가 통일되게 변경된다. 만약 각각의 컨트롤에서 다른 입력모드를 주고 싶다면 윈도우별로 InputContext를
생성, 해제하여 연결시키면 된다.
Input Context를 생성, 해제하는 함수
// InputContext를 위한 메모리를 할당하고, 그 핸들을 리턴 HIMC ImmCreateContext(void);
// 특정 윈도우와 연결 HIMC ImmAssociateContext(HWND hWnd, HIMC hIMC);
// InputContext를 메모리에서 해제 BOOL ImmDestroyContext(HIMC hIMC);
InputContext를 생성, 해제할 경우에는 Pen, Brush를 생성, 해제할때와 같은 방법으로 한다.
IME 관련 작업을 하다보면 IME의 활성/비활성 상태를 강제로 조정해야할 필요가 생깁니다.
관련 자료를 찾기 위해 인터넷을 검색하다보니 비밀번호나 아이디로 영문만 입력받고자 할때 많이 사용하더군요.
저같은 경우에는 중국어 관련해서 사설 IME를 사용하는데 문제가 생겨서 사용했습니다.
사설IME에서 입력을 받으면 안되는 상황에서 입력을 받고있어서 문제가 발생했습니다.
그래서 IME를 비활성 시키는 구문을 찾아서 넣었습니다.
- HIMC ImmAssociateContext( HWND hWnd, HIMC hImc );
MSDN의 ImmAssociateContext()를 살펴보면 이 API는 윈도우 별로 입력 컨텍스트를 만들었을때 컨텍스트를
지정하는데 사용할 수 있지만 hImc의 값에 NULL을 줄 경우, 해당 윈도우 창의 IME 포커스를 죽이게 됩니다.
따라서 관련된 IME는 동작하지 않게 되고, 사설 IME역시 동작을 하지 않습니다.
하지만 중요하게 알고 있어야 하는것은 ImmAssociateContext()를 할 경우 리턴값으로 기존의 HIMC값이 반환되기 때문에
나중에 사용을 위해서는 저장해 두어야합니다.
- void SetActive( BOOL isActive )
{
if( isActive )
{
// 기존의 값으로 IME를 다시 설정합니다.
ImmAsscociateContext( hWnd, _oldhImc );
}
else
{
_oldhImc = ImmAssociateContext( hWnd, NULL );
// IME를 비활성 시킵니다.
// _oldhImc는 값을 저장하고 있어야 합니다.
}
}
'Programming > Win32API' 카테고리의 다른 글
Keyboard 입력 받기 (0) | 2010.09.03 |
---|---|
IME 영문만 입력가능하게 하기 (0) | 2010.09.03 |
getClienteRect 와 getWindowRect (0) | 2010.08.31 |
mfc, api 의 HINSTANCE 구하기 GetModuleHandle(NULL) (0) | 2010.06.03 |
Virtual Keys, Standard Set (0) | 2010.04.21 |