|
|
一般之前人說用WM_IME_CHAR及WM_CHAR但此種作法不是一個良好的方法,而且在雙位元版時會有一些問題出現,所以建議採用下列方法,上述夾檔是MSDN中的範例,大多可以運用,但在嘸蝦米輸入法及一些不是微軟輸入法上運用上可能要有所修改,下面是參考別人的資料及上例範例中的小整理。夾檔: IMEAPPS.zip3 y$ B* M$ F& b* Y4 M9 V3 B, h
+ T) G2 M9 c+ C
// 輸入法設定狀態
Z3 |6 B; V% P2 M0 l$ VHKL hkl = GetKeyboardLayout(0);' R1 O: q# E* W
if(ImmIsIME(hkl))
3 I" {% V4 _& b3 H0 N6 Y{
$ ~0 G6 T* ^) E3 @+ K ImmEscape(hkl, hIMC, IME_ESC_IME_NAME, IMEName);4 p- w1 V1 h' W5 m; s7 F# l
if(IMEFullShape)
- K1 j+ P/ t% i: B6 |& ? sprintf(IMEShape, _T("【%s/全】"), IMEName);& Y; N! c |5 V0 m7 g
else' U: i# S& K' N! s$ D2 Y
sprintf(IMEShape, _T("【%s/半】"), IMEName);
0 Q2 B$ U& W3 [}
# T- O1 O% K; ]9 R* D. ~else0 h8 p( U* ]( R- P; S& @1 g4 S
{
# D# B! ?: d% c* s3 w( l strcpy(IMEShape,_T("【EN】"));
, P! l/ K- n4 e9 I}% b8 w; a: j0 C0 ^& ^ h
, V. c& G! A. u9 a% ~8 z
// 當中文輸入時" N# p3 t7 F4 d7 q( N9 p
case WM_IME_COMPOSITION:
* n; ~' @ t4 o hIMC = ImmGetContext(hWnd);5 S6 S$ A) D# j d, M
// 取得中文組字3 B" G8 q' {! D3 ^* y
if (lParam & GCS_COMPSTR)
& ?! A w; a; c. N5 y {
+ J, C2 I- ]6 J+ V dwSize = ImmGetCompositionString(hIMC,GCS_COMPSTR,szCompReadStr,sizeof(szCompReadStr));/ o0 a5 K' J4 s' s; L& R, e% U, ]
dwSize /= sizeof(TCHAR);- i- b1 X/ i* A9 B9 c! ^; M
szCompReadStr[dwSize] = TCHAR('\0');( A% P- s1 K) j9 H' o, H
}5 H: G6 O+ v1 n0 j2 `
! ?% r* c6 z2 |8 ^4 y
if(lParam & GCS_COMPREADSTR)/ k0 `) z6 E" E. U
{+ B: e6 z5 @! S U* N0 R4 ~
dwSize = ImmGetCompositionString(hIMC, GCS_COMPREADSTR, (void*)szCompStr, sizeof(szCompStr));5 x- p( }0 q- m/ L
dwSize /= sizeof(TCHAR);- f) k8 M7 ^3 O: a2 h* L& U6 c" Z
szCompStr[dwSize] = TCHAR('\0');" [, `) q9 t& ^1 X3 `9 [8 W
}
( M& R: m# h' t8 f, [/ `$ t! E/ d0 }- c1 A; e! R# V, ^
if(lParam & GCS_RESULTSTR)
( R; f! g" n: a( p; N {
7 w7 L- a- m' l2 @$ o+ M // 取得輸出字元 y, }8 n$ t( I3 M7 i2 ^9 W
dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, (void*)szChStr, sizeof(szChStr));
* G! G! k/ u+ K, @4 E2 @3 _; E dwSize /= sizeof(TCHAR);/ L; R0 x7 U7 G! F7 m2 r
szChStr[dwSize] = TCHAR('\0');
3 {0 g+ V( s/ t+ G. E lstrcat(m_szLineStr, szChStr);5 E7 r+ V% t% o) n. W; }
}
s1 D+ U5 \9 O. e* N' h break; |
|