|
|
一般之前人說用WM_IME_CHAR及WM_CHAR但此種作法不是一個良好的方法,而且在雙位元版時會有一些問題出現,所以建議採用下列方法,上述夾檔是MSDN中的範例,大多可以運用,但在嘸蝦米輸入法及一些不是微軟輸入法上運用上可能要有所修改,下面是參考別人的資料及上例範例中的小整理。夾檔: IMEAPPS.zip; F. t- n, |! h9 B
/ y) L& Y8 ^6 `/ ~" X( `// 輸入法設定狀態! R! O$ g2 a& A, E
HKL hkl = GetKeyboardLayout(0);
" ~) F7 T/ H: |if(ImmIsIME(hkl))
( R' M( d6 b( E4 I{
3 |1 L2 u7 X% n7 ^. S) R( { ImmEscape(hkl, hIMC, IME_ESC_IME_NAME, IMEName);
& ~. l7 Q: j' `2 I if(IMEFullShape)% E7 N C* n' ^+ X
sprintf(IMEShape, _T("【%s/全】"), IMEName);
$ t1 V7 c6 U2 J else t& @9 I% Q6 O U3 ?
sprintf(IMEShape, _T("【%s/半】"), IMEName);
7 A9 m: y( |( F/ |} Y( c# g2 n; s
else
$ W: r1 w2 ]: v8 L( F1 X8 F{: [+ ]. @6 g8 D. n+ U6 ~
strcpy(IMEShape,_T("【EN】"));
- a. I* P4 N+ I. }- X}, C& o8 }: k. M5 @$ E$ Q
0 P0 C" d/ ^7 x, C
// 當中文輸入時
3 G" A- E5 j& s5 I2 ~ M; Qcase WM_IME_COMPOSITION:
, O7 B2 i; S9 i/ O; T hIMC = ImmGetContext(hWnd);
0 L, F& S* D2 X2 a! ` // 取得中文組字7 w! F# T# T, a0 M; U
if (lParam & GCS_COMPSTR)/ P' P0 N5 Y# Z
{4 Z: n* p! ~' |2 q
dwSize = ImmGetCompositionString(hIMC,GCS_COMPSTR,szCompReadStr,sizeof(szCompReadStr));
# p* k- l/ |3 P0 C) K' Q- g1 z dwSize /= sizeof(TCHAR);9 _2 m2 k) O: O5 L" g) l9 p7 L" G
szCompReadStr[dwSize] = TCHAR('\0');
! `# Q8 I* C& k: P }
* ]& }0 ^1 q9 V2 H- i
: l9 ]. {# O8 B/ s if(lParam & GCS_COMPREADSTR)
& H, z- h' s" Q/ D {& z9 U- D0 ?) d% d; D
dwSize = ImmGetCompositionString(hIMC, GCS_COMPREADSTR, (void*)szCompStr, sizeof(szCompStr));* V( a$ d! `; B; d) Y7 r8 X
dwSize /= sizeof(TCHAR);
6 b, R( s% H' V4 k8 [7 t( C* B szCompStr[dwSize] = TCHAR('\0');
) |3 q6 d" c+ i- b }
, A3 u" l# @' H' \ s6 A o" o$ k, i7 x2 A3 v0 v
if(lParam & GCS_RESULTSTR)
) l$ P' i( L( e2 |+ y! a {7 T, @7 p$ M, A5 I* e3 H
// 取得輸出字元
! a2 j; o9 Y z dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, (void*)szChStr, sizeof(szChStr));* ]& d' E0 M* x* |
dwSize /= sizeof(TCHAR);
8 J- U S& T) J( i szChStr[dwSize] = TCHAR('\0');! ?4 G' O9 a( `" O* v- l
lstrcat(m_szLineStr, szChStr);( d9 s8 O2 s. l1 @& U! y
}- k/ I/ i2 |: w& [, s
break; |
|