정말 고생해서 찾았다.
구글링을 해서 찾지 못했는데 역시 MSDN 예제에서 힌트를 얻었다.
Message중에 "WM_INPUTLANGCHANGE"가 있다.
그런데 App에서 Message Hooking을 해봤는데 IME 변경을 할 때 들어가지 않는다.
윈도우에서 현재 화면에 있는 활성화 된 윈도우에 메시지를 보내지 않는 걸까?
결국 글 입력할 때마다 IME를 확인하도록 만들었다.
// Define language ID #define LID_JAPANESE 0x0411 #define LID_KOREAN 0x0412 #define LID_SIMPLIFIED_CHINESE 0x0804 |
한글은 조합을 해서 화면에 표시가 되기 때문에 "WM_IME_COMPOSITION" 메시지를 확인하면 된다.
그러나 '중국어'도 같은 메시지에 들어가게 된다. 중국어는 한글과 다르게 다양한 조합 화면이 나오는 어플들이 많다.
그래서 한글 이외에는 WM_IME_COMPOSITION 메시지로 처리하지 않게 만들었다.
"WM_IME_STARTCOMPOSITION" 메시지가 발생할 때마다 IME의 언어를 확인한다.
그리고 한글(LID_KOREAN)이 아니면 "WM_IME_COMPOSITION" 메시지를 무시해 버리게 한다.
GetKeyboardLayout(0) 함수를 이용해서 KeyboardLayout을 확인한다.
void SetChangeFont(HKL hKeyboardLayout, LPCTSTR szSelectedFont)
{
// Check keyboard layout
if (hKeyboardLayout == 0)
hKeyboardLayout = GetKeyboardLayout(0);
if (LOWORD(hKeyboardLayout) == LID_KOREAN)
//한글 키보드 레이아웃
else
//기타 레이아웃
//위에 제시한 define 값을 이용해서 중국어, 일어 등도 비교 가능
}
MSDN에서 제공하는 "International Samples"의 'IME'를 확인하면 도움이 많이 된다.
http://msdn.microsoft.com/en-us/library/vstudio/ee837238(v=vs.100).aspx
'C++' 카테고리의 다른 글
std::string Split (0) | 2016.04.26 |
---|---|
Visual Studio "he optimize pragma" 처리 (0) | 2015.12.22 |
floating point overflow 검사 (0) | 2014.08.28 |
JSON Spirit: A C++ JSON Parser/Generator Implemented with Boost Spirit (0) | 2014.05.13 |
C++ Json Parser (0) | 2014.05.07 |