|
|
一般之前人說用WM_IME_CHAR及WM_CHAR但此種作法不是一個良好的方法,而且在雙位元版時會有一些問題出現,所以建議採用下列方法,上述夾檔是MSDN中的範例,大多可以運用,但在嘸蝦米輸入法及一些不是微軟輸入法上運用上可能要有所修改,下面是參考別人的資料及上例範例中的小整理。夾檔: IMEAPPS.zip
" z; _' _ v/ p5 c$ M* Q
( Z4 _+ \ w) M0 b3 D// 輸入法設定狀態. e2 W( t" X0 b2 ~- l1 @# s
HKL hkl = GetKeyboardLayout(0);
; L/ \9 X3 I( ?9 L( jif(ImmIsIME(hkl))
' A; w* h: I' {' K, L; z. e{
2 _ w9 i/ A+ Z. O# } ImmEscape(hkl, hIMC, IME_ESC_IME_NAME, IMEName);
6 d6 V- l" x' F% G3 ^ if(IMEFullShape)) J4 W( v; R+ y. G( A
sprintf(IMEShape, _T("【%s/全】"), IMEName);
1 b& a; }$ D q, v" ` else
, n$ M4 O# x4 c sprintf(IMEShape, _T("【%s/半】"), IMEName);" F; I; w' ]9 {; u& \& M
}$ I6 g2 C# w5 o- C. I. P' Y8 M: W
else( ^8 B2 }+ N" a7 G
{
" {4 s# @' ?' c! ?! E strcpy(IMEShape,_T("【EN】"));
( y, C2 @3 Q7 C; I4 t# ]+ I}& X& T _1 V# d) t
6 B3 Q! S4 K0 a8 g3 L, H( I
// 當中文輸入時* `, x9 j7 k9 V9 O& A
case WM_IME_COMPOSITION:# d. m8 _$ X" S8 o$ \
hIMC = ImmGetContext(hWnd);, o7 ~! U4 M& e' D; U* L
// 取得中文組字
# ~# e( |9 p) ` if (lParam & GCS_COMPSTR)
$ N3 u3 A" f) b5 e0 N$ S {& R0 X- _3 X @
dwSize = ImmGetCompositionString(hIMC,GCS_COMPSTR,szCompReadStr,sizeof(szCompReadStr));
9 ~) z$ O4 M- U+ N, d dwSize /= sizeof(TCHAR);& x- t. |- x$ i, f
szCompReadStr[dwSize] = TCHAR('\0');3 p7 r" [/ \* S, H
} [ J% W; Z6 j9 B
& h! O. N4 }# x( K. g
if(lParam & GCS_COMPREADSTR)
7 P% I& g9 s# o3 }+ N/ {) | {
% C0 T- Y+ W' z3 X/ u dwSize = ImmGetCompositionString(hIMC, GCS_COMPREADSTR, (void*)szCompStr, sizeof(szCompStr));
# k9 {. @ x3 { E2 H8 p dwSize /= sizeof(TCHAR);4 V3 D' d/ O# D
szCompStr[dwSize] = TCHAR('\0');
0 K2 M* [. F/ M- r$ S, F }
# c& [4 j* H$ T4 j* a3 D. Q9 D! F: B& O
if(lParam & GCS_RESULTSTR)1 z' L- P# r7 T" s& ~
{
- q# _8 H6 S- L/ f/ B( ~ // 取得輸出字元
0 @0 S9 b* B; C. k- ]- u1 q; Y dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, (void*)szChStr, sizeof(szChStr));0 i% d# {* |% q Q
dwSize /= sizeof(TCHAR);* P* ]. [. i+ {+ ^, X- Z$ ]: N5 M
szChStr[dwSize] = TCHAR('\0');
0 G( d( l9 h) g% m1 D lstrcat(m_szLineStr, szChStr);# p9 z a2 t0 [
}
# `2 ~- y2 ~. K( ^ break; |
|