|
|
一般之前人說用WM_IME_CHAR及WM_CHAR但此種作法不是一個良好的方法,而且在雙位元版時會有一些問題出現,所以建議採用下列方法,上述夾檔是MSDN中的範例,大多可以運用,但在嘸蝦米輸入法及一些不是微軟輸入法上運用上可能要有所修改,下面是參考別人的資料及上例範例中的小整理。夾檔: IMEAPPS.zip
1 d+ K/ q: t' x, a, D D/ |/ m* y* \; B5 E+ t0 }9 G9 @
// 輸入法設定狀態
, b/ g- l9 G& {0 gHKL hkl = GetKeyboardLayout(0);' q/ U8 B/ ~1 T- t E7 s) @
if(ImmIsIME(hkl))
) o9 }1 x. I8 j/ s{1 |) l, C' |* B; H. {3 P. p
ImmEscape(hkl, hIMC, IME_ESC_IME_NAME, IMEName);
/ G ?& z' C/ Y y5 E% I. b if(IMEFullShape)
/ m" X( M0 [3 q: { sprintf(IMEShape, _T("【%s/全】"), IMEName);
7 i! D, t* l% d2 R$ o# `7 h else1 }! ^' e3 {; k' n9 F, J
sprintf(IMEShape, _T("【%s/半】"), IMEName);
0 O" F3 h8 Z3 _ s! ?, f, H+ X}
# ^8 X2 F2 H4 C- p' @# ^" kelse2 j7 K% J4 k3 p+ F
{
0 w# O' _3 Z9 L# T+ b strcpy(IMEShape,_T("【EN】"));
1 o8 \5 E' ]0 l" ?( `8 N}" e$ O Y, h1 j' t
- Z# @4 U4 n9 r" N( K" h, k4 K
// 當中文輸入時9 b" X1 P. R% q$ i o! K. a
case WM_IME_COMPOSITION:
4 [) I/ X$ h% ~9 p' u, K9 o hIMC = ImmGetContext(hWnd);" F* V4 W. U6 Q y9 }% r* D
// 取得中文組字
6 G4 l5 V, ~0 c- E0 W if (lParam & GCS_COMPSTR)
# C1 ]4 J; `+ [' V: X: T {7 N2 g. N+ ^) e
dwSize = ImmGetCompositionString(hIMC,GCS_COMPSTR,szCompReadStr,sizeof(szCompReadStr));
5 ^: L5 o4 g& r/ S- Q. w dwSize /= sizeof(TCHAR);
* _* m9 D- x1 h5 b) G1 b% { szCompReadStr[dwSize] = TCHAR('\0');: [. @- z) n$ r8 y+ ~
}
- `; w" r$ g( |! }% \' r6 z) o0 d3 a+ X7 B
if(lParam & GCS_COMPREADSTR)/ l. b9 F. A2 ^# u' f
{6 u) D+ I( J6 A
dwSize = ImmGetCompositionString(hIMC, GCS_COMPREADSTR, (void*)szCompStr, sizeof(szCompStr));
1 e+ L) x6 L& ~, H4 m* ]. D dwSize /= sizeof(TCHAR);$ \/ s$ F" Q: ^" g
szCompStr[dwSize] = TCHAR('\0');! R, d" b. f( q; `
}
# _4 x9 n, L" I/ F2 X0 O6 K$ M2 Y8 V& t+ i9 E# ~# a, p1 p
if(lParam & GCS_RESULTSTR): M9 G" ]& e4 w3 }3 ~" x
{. C( t) H$ ?7 u8 C0 \8 [
// 取得輸出字元: v# M0 ~8 |! H) ^0 g
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, (void*)szChStr, sizeof(szChStr));' ~# O" z3 p3 ~% A
dwSize /= sizeof(TCHAR);
# b" \/ W/ K8 v$ A8 l szChStr[dwSize] = TCHAR('\0');
7 s# {/ A8 X! r6 B lstrcat(m_szLineStr, szChStr);
$ Q5 f0 k; L& q) z8 F3 Y& X) R }* @' B8 D" P0 c6 t Y- K7 X x
break; |
|