none
편집기능 개발 , IME 관련 , 한글입력이 안되는 문제에 관한 질문입니다. RRS feed

  • 질문

  • 안녕하세요. 제목이 좀 그렇네요.. 몇일 잠일 못잤더니 ㅠ

    현재 WPF기반으로 AvalonEdit(http://www.codeproject.com/Articles/42490/Using-AvalonEdit-WPF-Text-Editor) 를 사용하여 편집기를 개발하였습니다.

    문제는 제일처음 해당 편집기가 focus를 가질때 IME가 활성화 되었을때 메시지가 오질 않습니다.(IME가 활성화 되지 않습니다.)

    focus를 다른창으로 가져갔다가 다시 해당편집가 focus를 가지면 WM_INPUTLANGCHANGE 메시지를 받고 IME가 활성화되어 한글이 입력가능해 집니다.

    Spy++를 이용해 메시지를 보았지만 한/영 키가 처음엔 WM_KEYDOWN , VK_HANGUL 이고, 두번째 focus를 받을때 WM_INPUTLANGCHANGE를 받고 한/영 키를 눌렸을때 WM_KEYDOWN , VK_PROCESSKEY 메시지를 받습니다.

    AvalonEdit 소스를 보면 WM_INPUTLANGCHANGE를 받을때부터 한글처리를 하게끔 되어있습니다.

    혹시나 해서 참고할 링크 걸어놓겠습니다.(AvalonEdit의 소스는 SharpDeveloper 4.3에 포함된 버전을 사용중입니다)
    AvalonEdit : http://www.codeproject.com/Articles/42490/Using-AvalonEdit-WPF-Text-Editor

    SharpDeveloper build server : http://build.sharpdevelop.net/BuildArtefacts/

    SharpDeveloper wiki : http://wiki.sharpdevelop.net/AvalonEdit.ashx

    요약하면

    1. IME 가 어떤 경우에 활성화 되는가요?

    2. 강제로 IME를 활성화 시킬수 있나요?

    2012년 5월 31일 목요일 오전 2:34

답변

  • 자답입니다. 자답이라도 해서 다행입니다. ㅎㅎ

    일단.. Windows XP에서는 두가지 버그가 있습니다.(더 있을수도 있지만 제가 겪은 문제입니다.)

    첫번째는, IME가 활성화되질 않는 문제 입니다. 별짓 다해도 안될때는 안됩니다. Default IME를 destroy 해봐도 실패하고, 새로운 IME를 associate해도 안됩니다. 강제로 포커스를 다른데 다녀오게 해도 안되고, 몇초뒤 포커스를 가게 해도 안됩니다. 이건 Windows XP와 IME 의 버그라 MS에서도 포기한것 같습니다. IME 버전에 따라 증상이 조금씩 달라집니다. 전 기본IME와 2002, 2007 가지고 테스트 해봤습니다.

    처음찾았던 해결방법은 , Keyboard.Focus(editor.textArea); 하면 되는 곳이 있습니다.(될때 기분 좋아졌다가 다른장비가니 안되더군요 ㅠ)

    버튼은 1x1크기로 구석에 만들고 Keyboard.Focus(btn); Keyboard.Focus(editor.textArea); 하면 되는 곳이 있습니다. (마찬가지로 안되는곳은 안됩니다.)

    현재까지 확실한 해결책은, winform을 호스팅해서 포커스를 winform의 아무 control에 가져갔다가 오면 됩니다. Keyboard.Focus(winformBtn); 하시면 안되고

    winformBtn.Focus(); 로 하셔야됩니다. 그다음, Keyboard.Focus(editor.textArea); 하면 됩니다. (editor.textArea.Focus() 하면 안될때가 있습니다.)

    덕분에 이번에 IME공부좀 했습니다. 잠을 못자서 몸살에 장염걸려서 이틀 누워있긴 했지만요 ㅋ

    두번째 버그는 WM_SETCOMPOSITIONWINDOW 명령을 보내면서 인자로 글자가 composition되는 위치를 잡아주는데, windows xp에서는 자기 마음대로 아무곳에나 그려버립니다.

    글자가 완성되기 전까지는 에디터에 나타나질 않습니다. 창옮겨 보면 composition 윈도우도 지 마음대로 옮겨 다닙니다. (참고로, 2수준 입니다.) 이건, 첫번째 문제처럼 꼼수로 해결이 되질 않습니다. 결국, WM_SETCOMPOSITIONWINDOW 메시지를 받아서 조립중인 한글을 캐럿이 있는 곳에 직접 그려줬습니다. 시간이 없어서 커서는 크게 못만들었습니다. (3.5수준 정도 되겠군요 ㅎㅎ)

    위 두가지 문제다 Windows 7에서는 나타나질 않습니다. (첫번째 문제는 간혹 Windows7에서 나타날때가 있더군요)

    혹시나 해서 참고 링크겁니다.

    http://msdn.microsoft.com/ko-kr/goglobal/bb688173.aspx

    http://deguls.tistory.com/entry/IMM%EA%B3%BC-IME

    http://msdn.microsoft.com/ko-kr/library/0x02zb6d(v=vs.90).aspx

    (이 외에도 많으나 도움이 될것 같아서... 그리고, 3번째 링크의 예제가 도움이 상당히 많이 되었습니다.)

    ps. 오해하실까봐... 위 문제는 WPF입니다. Winform에서도 비슷한 증상이 있긴 하지만 위 해결책은 WPF를 사용할때 입니다.

    =========== 수정 ============

    첫번째 버그는 아래 링크로도 해결 가능합니다.

    http://alwaysnewbie-textcube.blogspot.kr/2012/06/windows-xp.html

    • 답변으로 표시됨 always newbie 2012년 6월 6일 수요일 오후 1:08
    • 편집됨 always newbie 2012년 6월 6일 수요일 오후 1:24
    2012년 6월 6일 수요일 오후 1:08

모든 응답

  • 자답입니다. 자답이라도 해서 다행입니다. ㅎㅎ

    일단.. Windows XP에서는 두가지 버그가 있습니다.(더 있을수도 있지만 제가 겪은 문제입니다.)

    첫번째는, IME가 활성화되질 않는 문제 입니다. 별짓 다해도 안될때는 안됩니다. Default IME를 destroy 해봐도 실패하고, 새로운 IME를 associate해도 안됩니다. 강제로 포커스를 다른데 다녀오게 해도 안되고, 몇초뒤 포커스를 가게 해도 안됩니다. 이건 Windows XP와 IME 의 버그라 MS에서도 포기한것 같습니다. IME 버전에 따라 증상이 조금씩 달라집니다. 전 기본IME와 2002, 2007 가지고 테스트 해봤습니다.

    처음찾았던 해결방법은 , Keyboard.Focus(editor.textArea); 하면 되는 곳이 있습니다.(될때 기분 좋아졌다가 다른장비가니 안되더군요 ㅠ)

    버튼은 1x1크기로 구석에 만들고 Keyboard.Focus(btn); Keyboard.Focus(editor.textArea); 하면 되는 곳이 있습니다. (마찬가지로 안되는곳은 안됩니다.)

    현재까지 확실한 해결책은, winform을 호스팅해서 포커스를 winform의 아무 control에 가져갔다가 오면 됩니다. Keyboard.Focus(winformBtn); 하시면 안되고

    winformBtn.Focus(); 로 하셔야됩니다. 그다음, Keyboard.Focus(editor.textArea); 하면 됩니다. (editor.textArea.Focus() 하면 안될때가 있습니다.)

    덕분에 이번에 IME공부좀 했습니다. 잠을 못자서 몸살에 장염걸려서 이틀 누워있긴 했지만요 ㅋ

    두번째 버그는 WM_SETCOMPOSITIONWINDOW 명령을 보내면서 인자로 글자가 composition되는 위치를 잡아주는데, windows xp에서는 자기 마음대로 아무곳에나 그려버립니다.

    글자가 완성되기 전까지는 에디터에 나타나질 않습니다. 창옮겨 보면 composition 윈도우도 지 마음대로 옮겨 다닙니다. (참고로, 2수준 입니다.) 이건, 첫번째 문제처럼 꼼수로 해결이 되질 않습니다. 결국, WM_SETCOMPOSITIONWINDOW 메시지를 받아서 조립중인 한글을 캐럿이 있는 곳에 직접 그려줬습니다. 시간이 없어서 커서는 크게 못만들었습니다. (3.5수준 정도 되겠군요 ㅎㅎ)

    위 두가지 문제다 Windows 7에서는 나타나질 않습니다. (첫번째 문제는 간혹 Windows7에서 나타날때가 있더군요)

    혹시나 해서 참고 링크겁니다.

    http://msdn.microsoft.com/ko-kr/goglobal/bb688173.aspx

    http://deguls.tistory.com/entry/IMM%EA%B3%BC-IME

    http://msdn.microsoft.com/ko-kr/library/0x02zb6d(v=vs.90).aspx

    (이 외에도 많으나 도움이 될것 같아서... 그리고, 3번째 링크의 예제가 도움이 상당히 많이 되었습니다.)

    ps. 오해하실까봐... 위 문제는 WPF입니다. Winform에서도 비슷한 증상이 있긴 하지만 위 해결책은 WPF를 사용할때 입니다.

    =========== 수정 ============

    첫번째 버그는 아래 링크로도 해결 가능합니다.

    http://alwaysnewbie-textcube.blogspot.kr/2012/06/windows-xp.html

    • 답변으로 표시됨 always newbie 2012년 6월 6일 수요일 오후 1:08
    • 편집됨 always newbie 2012년 6월 6일 수요일 오후 1:24
    2012년 6월 6일 수요일 오후 1:08
  • 안녕하십니까? always newbie 님, 좋은 답변 드리지 못해서 죄송합니다.

    고객님의 문의 내용이 해결 되어서 다행입니다.

    더욱이 해결하신 부분에 대해서 공유해주셔서 진심으로 감사드립니다.

    2012년 6월 7일 목요일 오전 6:29
    중재자