TEdit나 TMemo 등의 컴포넌트에서 현재 한글이 조합중인지 확인하려고 하니 마땅한 함수가 없더군요. 그래서 Win32 SDK의 IME 관련 함수들을 뒤져서 이 목적으로 적당히 쓸만한 함수를 하나 만들어봤습니다. (윈도우 IME의 버그를 추적하면서 이것저것 테스트해보느라 만들었습니다)
아래 IsInComposition 함수를 호출하면서 인자로 해당 에디트나 메모의 핸들을 넘겨주면 됩니다. 조합중일 경우 true, 조합중이 아닌 경우 false를 리턴합니다.
아래 함수의 핵심은 IME 관련 Win32 함수인 Imm32GetCompositionString 함수인데, 이 함수는 원래는 조합중인 글자를 알아내는 함수이구요. 이 함수의 리턴 값이 조합중인 글자의 길이입니다. 따라서 조합중인 글자가 없을 경우 당연히 0이 리턴되겠죠.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
uses imm; function IsInComposition(hWnd: HWND): boolean; var H: HIMC; buff: array[0..1] of char; len: integer; begin result := false; H := Imm32GetContext(hWnd); if H <> 0 then begin len := Imm32GetCompositionString(H, GCS_COMPSTR, @buff, 2); result := len > 0; Imm32ReleaseContext(hWnd, H); end; end; |
델파이 2010과 2009에서만 테스트해봤는데, 뭐 코드로 봐서는 그 이전 버전이라도 제대로 동작하지 않을 이유는 없을 거 같네요.
저처럼 IME 기능을 추적하는 용도 이외에 이런 함수를 쓸 일이 있을지는 잘 모르겠지만… ^^;;;;
퍼갈께요^^