출처: http://moogi.new21.org/zb41/view.php?id=Freeboard&page=10&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=name&desc=desc&no=1552


IME API는 윈도우 API 중에서 공부하기 힘든 부분 중 하나입니다. 가장 큰 이유가, 영어 문서를 보면 거기 나오는 각 개념들이 한국어 IME와 어떤 관련이 있는지 도통 감잡을 수가 없는 경우가 많기 때문이지요. :-(

윈도우 IME API의 기능들 중엔 중국, 일본어 IME에나 필요하고 한국어 IME에는 필요없는 기능도 많이 있습니다. 반면 한국어 IME에 필요한 구조나 기능이 거기에는 불충분하게 구현된 것도 많고요.

1. 이미 입력된 한글에 대해 한자 후보 윈도우를 열기

ImmSetCompositionString()으로 임의의 글자를 조합하는 상태를 강제로 만든 후, ImmNotifyIME() 함수로 후보 윈도우를 열면 됩니다.

HIMC hImc=::ImmGetContext(m_hWnd);
::ImmSetCompositionString(hImc, SCS_SETSTR, "오", 2, NULL, 0);
::ImmNotifyIME(hImc, NI_OPENCANDIDATE, 0, 0);
::ImmReleaseContext(m_hWnd, hImc);

이렇게 하면 이 윈도우에 대해 '오'를 조합하는 상태가 됨과 동시에 한자 창이 뜹니다. 단, 그전에 먼저 한영 키를 눌러 '한글' 상태를 만드시고요.

한자 키가 눌러지면, 커서가 가리키는 한글을 블록으로 잡은 뒤 이 코드를 수행합니다. 그래서 사용자가 한자 번호를 누르면, 블록(한글)이 지워지고 그게 한자로 대체되는 효과가 납니다.

2. 한자를 한글로 바꾸기

한자를 한글로 바꾸는 기능은 한국어 IME가 지원하지 않습니다. <날개셋>은 한자로 바꾸는 기능과 마찬가지로 이것을 한자 독음 테이블로 독자적으로 구현했습니다.

3. 후보 윈도우 자체를 바꾸기

ImmAssociateContext 함수로 윈도우 IME를 완전히 끈 뒤, VK_HANGUL이나 VK_HANJA 키가 들어왔을 때에 대한 처리를 OnKeyDown에서 직접 하면 됩니다.

hPrevImc=::ImmAssociateContext(m_hWnd, NULL);

그러면 이 윈도우에서는 IME 창 자체가(한영, 한자 변환 버튼이 있는 도구상자) 뜨지 않고, IME 관련 글쇠가 눌러져도 아무 반응이 생기지 않습니다. 필요할 때는 NULL 대신 hPrevImc를 다시 넘겨주면 이 윈도우는 원래대로 윈도우 IME의 지시를 받게 됩니다.

> 안녕하세요..
> IME관련 문서들을 찾아보다가 이 홈페이지를 들러보게 되었습니다. 홈페이지를 보다보니 카이스트 후배시더군요.. 저는 99학번 전산과 박준하라고 합니다.
> 홈페이지 내용이 알차고, 후배께서는 뭔가에 충분히 매진하고 있는 것 같아 정말 보기 좋고, 한편으론 부럽기도 합니다.
>
> 제가 여기를 찾아오게 된 건 IME관련 문서들을 찾기 위해서 였는데, 인터넷에서는 생각보다 많은 자료들이 없더라구요. 현재 mfc에서 CWnd를 계승받아 CEdit와 같은 기능을 구현하려고 하고 있습니다. 하다보니 정말 복잡한게 많더군요..
>
> 지금 제가 여쭤볼 것은 한자 입력에 관한 것입니다. 한글을 입력하는 도중에 한자키를 누르면, 그 처리는 IME자체에서 하게 되는지 한자 입력이 잘 됩니다. 문제는 한글을 미리 쭉 입력한 후, 그 한글을 한자로 바꾸기 위해서, 한자로 바꿀 한글 앞에 커서를 두고서, 또는 바꿀 한글을 선택한 상태에서 한자키를 누르면 도무지 작동하지를 않습니다. 그럴 경우도 한글 입력 중에 한자키를 누른 것과 같이 후보창(candidate window)가 떠서 한자를 선택할 수 있게 했으면 좋겠는데 말입니다.
>
> msdn에서도 candidate window 등에 관련된 함수를 몇몇 보았으나, 어떻게 사용하는 지 잘 모르겠고, 또한 이 부분에 관련해서는 예제 또한 찾기가 힘들더군요.
>
> 개발하신 날개셋편집기를 보니, 그 기능 역시 완전히 구현되어 있었습니다. 한자입력 창이 기본 ime의 창과 틀린 것으로 보아 직접 구현하신 거라 생각됩니다만, 혹시 도움을 주실 수 있다면, 제가 하고 싶은 부분에 도움이 될만한 조언이나 참고자료를 주시면 정말 감사하겠습니다.
>
> 그리고, 날개셋편집기에서와 마찬가지로 후보창(candidate window) 자체를 어떻게 바꿀 수 있는 지도 알고 싶습니다.
>
> 그럼 좋은 하루 되시길~
>


AND