본문 바로가기
C++

IME 선택된 언어 확인하기

by leo21c 2014. 9. 5.
SMALL

정말 고생해서 찾았다.

구글링을 해서 찾지 못했는데 역시 MSDN 예제에서 힌트를 얻었다.

Message중에 "WM_INPUTLANGCHANGE"가 있다.

그런데 App에서 Message Hooking을 해봤는데 IME 변경을 할 때 들어가지 않는다.

윈도우에서 현재 화면에 있는 활성화 된 윈도우에 메시지를 보내지 않는 걸까?

결국 글 입력할 때마다 IME를 확인하도록 만들었다.

// Define language ID
#define LID_TRADITIONAL_CHINESE 0x0404

#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

LIST

'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