作心 三日이면         三日마다 作心하라!
by Ditongs
카테고리
태그
rss

skin by 꾸자네
[Win32] IME 한자 후보자(Candidate)에 대한 음훈(音訓) 얻기

  한글 관련 프로젝트를 진행하고 있어서인지 계속해서 IME에 관한 글만 쓰는것 같다. 오늘도 역시 IME 때문에 고생좀했다. 무엇보다 IME에 관련된 자료를 찾기가 무척이나 어렵다. IME가 아시아권을 위한 확장 입력기에서 유래되었기 때문인지 구글에서 조차도 관련된 글들이 부실하다. (영어사용자들은 IME 쓸일이 거의 없기 때문일테다)

우리는 한글을 한자로 변환하기 위해서 [한자키]를 눌러 후보자 윈도우를 생성한다. 후보자란 무엇인가? '이'라는 글자에 대한 한자는 무척이나 많다. 오얏 이, 두 이, 가까울 이 등등... '이'라고 발음되는 한자가 10가지 이상이된다. 후보자란 이렇듯 같은 성격에 그룹을 말하는 것이다. 실제 사용하려는 사람만이 정확한 글자를 알고 있는 것이다. 

                                                <그림1> 한글 "이"에 대한 한자 후보자 목록


한자 뿐만 아니라 우리가 특수문자라 일컫는 다양한 기호 문자들도 해당하는 그룹이 존재한다. 동그라미가 그려져 있는 숫자라든가, 그리스 문자라든가, 선을 만들 수 있는 문자라든가... 이런것들은 모두 그룹으로 묶여져 있다. 자주 입력하는 당구장 모양에 글자를 입력하기 위해서 우리는 'ㅁ' 글자를 입력하고 한자키를 눌러 기호에 대한 후보자 윈도우를 표시하고 당구장 글자에 해당하는 번호 6번을 선택하여 최종적으로 '※' 글자를 입력한다. 

  WindowsXP 기본 내장 후보자 윈도우는 위에 그림을 보면 알겠지만 엄청나게 투박하다. 또한 한자에 대한 훈(뜻)을 알기 위해서는 해당하는 한자에 마우스 커서를 일정시간동안 위치 시켜야 하는 불편함이 있다. 나는 오늘 기본 후보자 윈도우를 커스터마이징하여 사용자정의 후보자 윈도우를 만드는 일을 했다. IME 관련 API를 이용하면 한글에 해당하는 한자 후보자 리스트를 쉽게 얻을수 있다.
ImmGetConversionList () 함수를 통하여 목록을 얻을 수 있다. 그런데 뜻에 해당하는 한글 리스트를 얻는 함수는 IME API를 아무리 뒤져도 찾을 수가 없었다. 윈도우즈 내장 후보자에서는 툴팁으로 뜻을 나타내어주고 있으므로 분명히 해당 매핑 테이블이 어디엔가 존재할 것이다. 이 매핑 테이블을 어떻게 찾을 수 있을까??? 8시간 넘도록 인터넷을 뒤졌으나 같은 질문만 있지 이에 대한 해답은 찾을 수가 없었다. 해당 테이블을 직접 만들어서 사용하라는 답변이 대세였다. OfficeXP를 설치하여 IME 2002 버전으로 사용하라는 글도 있었는데, 이것은 좀더 심플한 UI를 가진 IME를 사용하라는거지 궁극적인 커스터마이징을 위한 명쾌한 답변은 아니다. 검색으론 답을 얻을 수 없음을 인지하고 결국 임포트(Import) 되는 IME 관련 모든 DLL을 분석하기로 마음먹었다.

관련 DLL 의존성을 따라가본 결과
C:\WINDOWS\ime\IMKR6_1\DICTS\hanjadic.dll 파일에 의존하고 있었다. 한자 사전이란다. 파일이름 자체에서 수상한 냄새가 물씬 풍긴다. hanjadic.dll 파일은 COM 컴포넌트이다. OleView 프로그램을 통하여 노출하고 있는 인터페이스를 확인했다. 아래는 OleView가 해석한 타입 라이브러리이다.


 [ Hanjadic.dll - COM Interface ]

// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: hanjadic.dll

[
  uuid(0C159048-FB79-470D-91B8-7A441A850B42),
  version(1.0),
  helpstring("Korean Hanja Dictionary 1.0 Type Library")
]
library HJDICTLib
{
    // TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("STDOLE2.TLB");

    // Forward declare all types defined in this typelib
    interface IHJDict;

    [
      odl,
      uuid(22BA0232-F708-485A-917B-FE70B4222D89),
      helpstring("IHJDict Interface")
    ]
    interface IHJDict : IUnknown {
        [helpstring("Init Dictionary")]
        HRESULT _stdcall Init();
        [helpstring("method LookupHangulOfHanja")]
        HRESULT _stdcall LookupHangulOfHanja(
                        [in] LPWSTR pwszHanja,
                        [out] LPWSTR pwszHangul,
                        [in] int cchHangul);

        [helpstring("method LookupMeaning")]
        HRESULT _stdcall LookupMeaning(
                        [in] unsigned short wchHanja,
                        [out] LPWSTR pwszMeaning,
                        [in] int cchMeaning);
    [
      uuid(0631B62B-67EA-46D5-B5C9-E632E0D1493D),
      helpstring("Korean Hanja Dictionary Class")
    ]
    coclass HJDict {
        [default] interface IHJDict;
    };
};

  LookupMeaning () 함수를 노출하고 있다. 첫번째 인자로 해당 한자에 대한 유니코드값을, 두번째 인자로는 뜻을 받기 위한 버퍼를, 세번째 인자로는 버퍼에 크기를 요구하고 있다. 테스트 결과... 잘 얻어온다 :) 


                                     <그림2> 커스터마이징한 한자 후보자 리스트

by Ditongs | 2008/05/28 23:42 | Software | 트랙백 | 덧글(1)
트랙백 주소 : http://ditongs.egloos.com/tb/1739838
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 조동주 at 2010/07/13 09:39
안녕하세요
현재 닷넷기반으로 IME관련 작업을 하고있는데요.
님이 만드신 한자 후보자 리스트 소스를 참고하면 큰 도움이 될 것 같아 염치없이
글 올립니다.
혹시 가능하시다면 소스를 좀 부탁해도 될까요?
그럼.. 감사합니다. karani75@gmail.com

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶