프로그램을 개발하다 보니 한글 이벤트를 잡아서 처리할 일이 생겼습니다.
보통 한글 이벤트는 WM_IME_ 이벤트들로 처리를 하지만 이번에는 그 이전에 메시지를 잡아야하는 상황이 발생했는데요. 물론 WM_IME_로 잡아도 되겠지만, 그렇다면 기존에 처리해놨던 코드를 다 바꿔야하고 좀 더 복잡한 상황으로 빠져들 수 밖에 없어서 그 이전에 처리하기로 마음을 먹었습니다.
컨트롤의 WndProc 사용합니다.
IMessageFilter 도 동일합니다.
class MyControl : Control
{
const int WM_KEYDOWN = 0x0100;
protected override void WndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WM_KEYDOWN)
{
if (m.WParam.ToInt32() == (int)Keys.ProcessKey)
{ // 여기서 처리
}
}
}
};
위와 같은 코드를 넣으면 한글에 대한 정보를 알 수 있습니다.
한글의 한 글자를 입력 시 메시지 순서는
WM_KEYDOWN => WM_IME_STARTCOMPOSITION
으로 됩니다.
제가 사용하는 컨트롤에서는 IME 메시지가 들어오기 이전에 무언가 처리가 되는 부분이
있어서 그 처리가 되기 전에 해야할게 생겨버렸습니다.
그래서 WParam 을 ProcessKey 로 처리해버렸습니다.
ProcessKey는 무언인가???
구글링해도 명확하게 안나오는군요. 물론 MSDN도요.
이 내용이 MSDN 의 설명입니다.
이런 뜨바~!
그러나 여러군데 검색 시 알게된 점이 있습니다.
처리 완료가 안된 키를 ProcessKey 라고요.
왜 처리가 안될까요. IME 키 입니다.
위 내용은 MS의 내용입니다. IME는 다국어 지원을 위한 방법입니다.
아시다시피 한글은 한 글자가 키보드 1개로 끝나지 않습니다.
'ㄱ' 과 'ㅏ'가 만나야 '가' 라는 하나의 글자가 완성됩니다.
한글을 입력할 때 발생하는 이벤트가 WM_IME_ 메시지들이고요.
그 메시지가 발생하기 전에 WM_KEYDOWN이 발생합니다.
그때 WParam에 ProcessKey 가 들어오고요.
위의 MS 내용처럼 일본어나 중국어도 해당하겠죠.
여기서 LParam 정보로 입력된 키의 정보가 들어오는거 같습니다만, 아무리 검색해도
해당 내용은 안나오더군요.
단, 한영키는 1106378753로 들어옵니다.
if (m.WParam.ToInt32() == (int)Keys.ProcessKey && m.LParam.ToInt32() == 1106378753)
{
}
라고 하면 한/영 키를 알 수 있습니다.
그외에는 IME 키라고 보시면 됩니다.
굳이 여기서 한글인지를 아실려면 IME 정보를 얻어와 한글여부인지를
판단하시면 됩니다.