|
//******************************************************************//% n7 J1 `8 j. k! N& D$ z
//( K. T& ^- c3 J6 @; a2 C$ H
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
% y9 y1 i7 K/ N; o- k// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
. x* Q- `" ^( @# ]// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
& @, Q% c6 p7 L// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT v' U& d! g5 M& g
// 为显示信息用,可以用其他方法替换如 TxtOut() 等
0 V6 `9 ?' O0 \) [- w) l//( R' _! t; B) \6 q+ f
//******************************************************************//
' C; `& H& m7 m& [6 P- |4 ~$ ]! U4 w' g
//////////////////////////////////////////////////////////////////////' b6 x$ A/ s8 {7 l8 V
//
3 _' q$ f. i' Y6 U4 `6 p, z. C// IM.h: CIM class (使用系统)输入法类
$ |; w5 X2 x k5 w4 q. u// 2001/4/30 Write by Jerry Wang
, d: N! b1 _: S) z% `7 r// 感谢大大鱼的帮助- t/ p7 W6 D& d% O, x
// Need Lib: imm32.lib3 \7 J; x- R% W- b8 L
//' S4 G4 D6 {0 |
//////////////////////////////////////////////////////////////////////
, f& W$ n; Q. A- `/ A$ i. A4 i4 _# \* t- H7 k+ T. x
#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
: G# t, u' \) y3 _, d2 G#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_
1 `& R1 G* j2 i2 {% s+ M) b8 v$ j* g9 Y, v E
#if _MSC_VER > 1000
( K. w# J" P' k; ?1 y#pragma once* T8 |# R% J8 U
#endif // _MSC_VER > 1000
7 w }7 Y; Y" \5 e& v
0 I; ^+ M8 c( E#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数
' L9 z {; R; {+ ?4 g% r+ z" {4 R; o2 h. o8 z
#include "FindMe.h"
) y+ q0 X) r; ^# v$ d2 i1 m9 t% R
+ j( p2 S1 A1 g) m: R; }$ u2 }( Zclass CIM 0 v% D0 i# _+ [0 U: N
{$ n* ?9 h# Q6 \8 s2 k
private:% ]* b( a/ N: f% E2 Z C
CTTFFont ttffont; //显示信息# l- R4 z. f3 K- K
LPCANDIDATELIST m_lpCandList; //输入法候选文字列表% ]# E e, O% a, U/ y5 N
LPSTR m_lpszImeInput; //指向IME输入的文字字符串指针
, a) L5 d% ~: Q$ ?, b* `( T9 G LPSTR m_lpszCurInputLanguageDesc; //指向当前输入语言描述的指针" o, }. w# }) v" N- o6 w4 r9 Q
char m_cCandidateList[255]; //候选文字列表缓冲区- L; F, G# u* I9 J4 C+ u- u
char m_cInput[64]; //输入的字母1 C. n$ Z7 b# V5 t+ f+ V
' ~6 K2 t5 Z& Y2 x, H, H0 ^5 t BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串" K& w/ b1 m7 Z
' D; K$ C5 r$ z! T3 i
public:
9 I8 e+ r4 S: e0 u3 \5 l3 s: B; I; d
CIM();
; t8 e4 O/ W3 }/ e1 j virtual ~CIM();
+ r* H* g3 y# p; i7 T* @% ?' b W: b# [' u7 S
LPSTR GetResultString( void ); //取得输入的字符串
! \, g N2 g) V X: m0 B1 R$ s2 ~ i
void UpdateShow( ); //显示输入法信息, @# b N( M2 l/ o
4 x5 b" u( _ m! ]* y
LPSTR GetCurInputLanguageDesc( ); //取得应用程序当前使用语言的描述
2 }) d; F; P8 w! a void ClearCandidateList( void ); //清除输入法文字候选列表
) M: w h. B. a! F' @" o+ Z BOOL GetCandidateList( HWND hWnd ); //取得输入法文字候选列表
4 W, I; O8 Y% k7 C. E BOOL ImeIsOpen( void ); //输入法是否打开
1 A4 k+ f0 \/ A7 B+ r6 I. n void OnChar( TCHAR ch ); //处理WM_IME_CHAR消息# q& x8 ?' F- a% f5 F2 X
void OnImeNotify( HWND hWnd,WPARAM wParam ); //处理WM_IME_NOTIFY消息1 T* Q- l) G! A: F
void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息: r7 O' Q* S3 `, d' F4 l+ d: z
};
$ v2 a2 V" G5 v8 Q- b, l) n
~5 a1 e& ~& I q [#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
/ J1 V' T. i/ p6 m
# p% D1 X, }/ i2 x* e
* Z0 z, t; ^- N' u! W! [5 z( B- @ R' C9 {
//*********************************************************************************************//
2 b i& w4 b" j, N y. h. z2 F/ k" J; @) m p
//////////////////////////////////////////////////////////////////////
- @7 C, f8 `' A2 h' [ ]//
Z& f- C1 o' ^8 n' r/ g, F// IM.cpp: CIM class (使用系统)输入法类! i8 F& }, g X# B7 P2 ?9 E3 I
// 2001/4/30 Write by Jerry Wang' x J% H) p/ R9 Z3 \
// 感谢大大鱼的帮助
$ l; f: n5 j% @! L% x' d6 B// Need Lib: imm32.lib
+ a& m2 M" }: e' W! y//
, ?3 }& h3 R. O; U9 c+ w9 t//////////////////////////////////////////////////////////////////////
4 W# o: `( `8 a/ I7 z& M# L: a1 J1 r$ ~- } x3 e7 j, @
#include "imm.h"$ m/ e' _" _) z o% f: e+ N
% p" ?- t% _0 h" v1 w, i" x# s6 `//////////////////////////////////////////////////////////////////////! Y; N2 |$ Z7 u5 i. P( ?
// Construction/Destruction
8 P* E3 _& s2 H `% y( {//////////////////////////////////////////////////////////////////////4 c+ x$ Q# @! g1 R) B9 _$ s
3 l+ A0 A. C& ^% z' SCIM::CIM()
0 Y" U. c8 k9 E2 S% r7 e{
5 E" N& _+ \9 o) ~% d' B m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
' i4 R P6 X& y( {0 W" ] ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
3 H S6 S7 \0 p: \) S! I8 g( k *m_lpszImeInput = '\0';9 S. x J8 n) g/ G% y0 c. v/ E
*m_cInput = '\0';
3 Q" L/ T( g1 `- f; {$ S6 }% }5 _4 N) I
ttffont.Create( "黑体",15,RGB(255,255,255) );+ @, U0 H8 u7 l6 m2 r; M- G
GetCurInputLanguageDesc();1 S% [0 B% \& ^
}
0 w) M) q# f! y, g" ^
0 z/ C* }3 {0 T+ DCIM::~CIM()3 E6 p. z$ O7 h( b/ X( [
{
$ q! U& ]1 U6 [# A6 Z; S1 s4 Z ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
5 x9 J) d2 `( E! ?& a5 ~# m/ Y1 N- h1 R4 W+ G
CHKB( delete m_lpszImeInput );
6 H; _- P) d: p7 ^* K2 h: f/ | if( m_lpszCurInputLanguageDesc != NULL )
3 l0 L6 R+ y: L) q* v; i1 M CHKB( delete m_lpszCurInputLanguageDesc ); - g/ Q) {; q* l" ]$ J
}
* O1 I( w/ q" v1 E$ U* t5 W" H0 ~5 }1 c# x5 ^6 S
void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
! e% J& v. J5 W" o{9 m% A( A. e3 g/ o! z2 T
if (lParam & GCS_RESULTSTR)# M5 T T. [* \4 F: e
{9 @7 C" Z" J' A0 A' ^% s: l* `8 Q$ B
HIMC hIMC; //输入设备上下文
4 s9 O1 \1 f% \" G DWORD dwLen;6 Q A# ^' H2 ^' ?
LPSTR lpResultStr;
5 h" K3 f" ~; T
2 Q, I0 w1 |; G2 Z1 z2 H9 T hIMC = ImmGetContext(hWnd); //取得输入上下文
# H+ `" {4 h+ ^4 ~3 U- B+ z3 U8 H0 u
7 H" p% T# o0 f" a) `# P$ E if (!hIMC); J! \0 O5 W% ]% O( b
return;
3 B0 B" z0 v9 k) _1 h
$ |( w4 A- o7 \* X dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
& i) i' [% ]( Z# m* ^. c0 [, b dwLen+=1;" E: |; |& {! d! t$ @& I$ z
* O: x) V6 Q$ E if(dwLen)
5 f* _+ @8 g, V/ {9 K: B/ a {7 t% c0 F4 }- ?/ }3 b+ F' h
lpResultStr = new char[ dwLen ]; D5 y) }; B1 y0 t7 ]
8 E+ c2 b/ ^+ n! P
//// 缓冲区已经满了2 F; X5 w# s9 o* m
if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 ); c/ {5 C( N5 C. [9 X
{! p! b& e4 D6 l# f/ O8 S
MessageBeep( 0 );- y( g7 @ _2 _
return;
: @9 c% s3 s8 S: m9 m/ s }& t; ~7 i# D9 F- W* M# D2 }, w) g
ZeroMemory( lpResultStr ,dwLen );
# S# r+ d/ U7 ? if (lpResultStr)
/ u) O* n9 I/ |1 E+ P* M {
, C/ q$ {2 ?9 R$ R u: w; H/ _ ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
. N1 ~ m" y7 m, w/ U3 t7 V strcat( m_lpszImeInput,lpResultStr );% ^& ]6 A& }% G
}
9 I# B3 @* }! u# ` O7 S+ | delete lpResultStr;
! z" ?6 B$ g g }1 v k* E: p, x( V1 m# I1 Y
& y- I5 G' B) ]0 G5 E) @( ~ ImmReleaseContext(hWnd,hIMC); //释放输入上下文
. w; P2 g. e7 h& v7 Q }
/ b2 s% Y, ^9 I2 y
$ l- d* i, `2 G% s, k3 ?) l! @' A}7 s! W( |# {1 X G% h6 a6 j. n
. e! [0 [% `' a- Z. wvoid CIM::OnImeNotify(HWND hWnd, WPARAM wParam)% H$ X: m/ Q, V7 W+ E7 _/ {7 I1 U* s
{
* A3 ~6 e0 Q% {1 o9 ~, e4 l8 R* K; { DWORD dwCommand = (DWORD) wParam;
! U' {5 A0 I4 [- G1 r switch( dwCommand ): l7 m( z1 A$ Y+ p* M, ^
{1 d0 T) a3 [( K. f
case IMN_CHANGECANDIDATE:" b" Y0 n, A9 `# L( _
GetCandidateList( hWnd );+ x8 B, o1 r: ^: ~ @* H, U' o
break;9 s3 h( J0 u f1 v% f
/ c4 _- i3 G1 J. t) u
case IMN_CLOSECANDIDATE:
" F' G G5 o7 t, ?5 k ClearCandidateList();2 _) ? \& V/ q- m: e- K
break;
2 n1 x/ z- n, T f$ ^- M: W: W- F! H u
case IMN_OPENCANDIDATE:
/ t6 b* c& f/ W7 `" C6 F GetCandidateList( hWnd );+ V# U5 ]$ H( `' ^
break;
: `. }. n# T6 s }6 A. r2 G; c1 U3 l8 C5 T. V. f
}
3 d# R: z# v* d4 m% K" g
" C; T9 [7 K- w1 }- p7 P9 L* avoid CIM::OnChar( TCHAR ch )
; P# d, A0 F9 R( h6 r' a; m- m, K{
, o' P v" }4 W. o& e$ m int len = strlen( m_lpszImeInput );# J$ q6 T, U, |$ `* X$ l$ }
' \+ q8 W0 ]6 t) q! t! c; @ if( ImeIsOpen() ) //输入法打开状态
8 u6 o) I0 A, a4 }$ @ {
$ x" k2 G9 l9 d+ t( ?2 x: a
$ i7 k4 Z# ^- @ }0 X8 w! n- r) z
else //输入法关闭状态
! X/ t" ], I6 x) l+ h {3 w2 f$ J8 g8 d7 \& r5 X
if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
; s/ b: z. M* v( e {6 p0 S7 N( p7 }# p+ J- D2 p
*( m_lpszImeInput + len ) = ch;
- P0 q8 I- {+ U3 l- V( Q *( m_lpszImeInput + len + 1) = '\0';
4 J9 F( ?$ c% ?. L/ J: }" ^! f9 ~ }
7 F! v. ] @4 h; q* _+ f }9 i4 _) s; U# [7 o. A. q
; I( A, c1 e( m7 @
if( ch == 8 ) //BackSpace字符
: U/ ]9 K4 F. E7 V {7 }( }6 Z4 B( E) B
if( len == 0 ) //字符串长度为零
9 R$ P6 e/ C& r3 m9 C return;" { l4 L2 a) @1 X3 v) l: ^
6 R$ H8 @* o3 e( Z3 O& n
if( len == 1 ) //只有一个字符
# g. C6 ^; z7 b' J {
$ o( O) \7 c% ~ *m_lpszImeInput = '\0';
% t, L8 U# r- K1 K9 w6 Z return;
; w) P1 R; H9 s/ A, |8 x8 p. a }9 a5 d6 h# t) D: A. s ~ \
- c! J# ^; W ^& O' t BYTE cc1,cc2;
1 g! M4 c, e: Z" K+ ^' e cc1 = *(m_lpszImeInput + len -1); //分离字节
- s' Q4 J- l0 v cc2 = *(m_lpszImeInput + len -2);
1 t( }2 v/ z1 r; E# v
$ ^2 b# D' E% q8 _# A if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
$ m4 v6 J) ^4 o *( m_lpszImeInput + len -2 ) = '\0';3 l8 E/ J* X- B, y3 O
else //是英文字符(单字节)) F: M5 D2 `- w9 [" f
*( m_lpszImeInput + len -1 ) = '\0';
; J; v/ d- f* q# P }' E' W; o6 n, s4 I
}( C; v# [7 V( V* c0 Y" B' l
/ f) b# s8 q( q3 e3 W: J7 U
BOOL CIM::GetCandidateList(HWND hWnd)
3 e9 j$ {" F& C{! {5 C. B. O! T
DWORD dwSize; ) J& w) {, J/ b
HIMC hIMC;+ \! D; ?0 f2 Q3 e. J
7 p" Y/ b2 W/ u# t. ?& d: I ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
Y7 K4 R% X' V9 d }- Q3 h& D! E1 `2 i; |: f7 f5 K/ H7 y# {
if( m_lpCandList )
: }; @) m4 N$ a* m) O {
' b* p$ d- c7 o7 [ delete m_lpCandList;
7 S2 Y! \7 {$ T# j m_lpCandList = NULL;
3 W: }# ]2 `8 y+ v( Q }
/ A7 e- B* |/ p0 E
% M2 O1 U' g0 ^1 g5 r" V5 U if( GetKeyboardLayout(0)==0 )
8 V- B* h6 u+ P9 X6 ?/ ]0 A {) g- E/ [2 {8 k, I* v7 ?1 G- o
return FALSE;
w8 y( Z' I4 ?7 i) ` }" @# x, X6 {7 \8 }, I
0 |0 J( Y8 a! @6 b
hIMC = ImmGetContext(hWnd); //取得输入上下文% g( s2 V3 E0 y8 j
if(hIMC == NULL)$ ?* e/ h7 ?$ h0 g' l3 M
{+ o' h1 e3 Y3 u6 G/ Q" j' j% q
return FALSE;3 J/ y- H+ v% P- F' O: f; z5 A
}
. r4 d; U5 n J# M% `1 i6 o5 J( V9 l& i O1 j
ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );: R" e7 J5 I8 D& v4 P
if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
5 ^, Q% G. r- a {1 S' E7 C( _0 }7 I" M& Q
m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
+ _; C% l' ]# m if(m_lpCandList)* ]2 E% v$ {4 v/ i
{. ?1 t7 Q" {+ z! a( Z# A
ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);; K6 v$ A+ q( X, ]
CandidateToString(m_lpCandList);
3 I% k" d( O' @4 W0 c( G, h } _8 E8 ?5 H" `) z! j
} - K: v, C5 q8 p; D$ n
& e. [: _& c. v! M( {2 C+ Z
ImmReleaseContext(hWnd,hIMC);
# `& b! G" Y( Q+ x
$ F( p1 D* ? |4 ` v' { return TRUE;& _! D7 @! S6 K
}7 Y$ n( o: z6 R8 ^5 L# ^9 ]
) f# P1 Q2 t/ u0 J, m2 j3 cvoid CIM::ClearCandidateList()
* V* h+ i$ s5 @8 ^2 |{
0 ~6 S$ \, |( F9 N8 v5 s. }8 [/ [ if(m_lpCandList)
3 ^, T7 q. H2 M: y }- \# m$ S/ N {
4 I [+ c8 K& I0 j( Y# H2 Q delete m_lpCandList;
" K" X5 u2 q, O9 |# c# P8 F* e m_lpCandList = NULL;- ~2 K& Q( ~3 D- A+ u
}
9 d; [7 }1 l4 t; R4 S9 Q ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );7 ^0 d1 H$ i0 X( J% @
}) P7 v$ ^: _% u8 b2 H
" P! U3 l t9 f7 v3 f8 J
/ F- } w0 A1 k! T7 B3 ?) QLPSTR CIM::GetCurInputLanguageDesc()
3 D0 l3 l; ^9 ?- A, I- q/ x{/ Y& j& I# A, r; i( C4 v
HKL hKL = GetKeyboardLayout(0); & n+ _ J- G5 H9 }+ u' J
# G0 b# @; }& p" |' H
if( m_lpszCurInputLanguageDesc != NULL )# V0 C2 v- J: I- o
CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^
& m& g4 ? D! P# N. A. Q
4 r6 x( ^( C! x" R, R int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度3 p0 j0 f- l3 i3 R7 V1 M' [; K
! y8 n8 O% Z8 x* X( L3 O; k0 \$ |1 d$ l CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );6 y/ s4 m' _; c) _. O! D" @1 C" v
f3 e9 v" s! H, d
if( lengh )
* b! }+ Y% l5 m+ D% Q) z* u {* o- U9 |0 h) l, C0 U# j5 r: O: R
ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
: d9 ]+ K) f G' b6 q! | }0 Y& q% h! {0 B$ g' _. c
else; o2 F* ~5 s6 u0 b% `; G1 D
{# V( E) P) _) K& m5 a1 W$ r" U
strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );' s, n+ m+ J4 i
}
+ L) x! k) d5 S3 @& s' E7 H( w- d& t
return m_lpszCurInputLanguageDesc;
2 N- a) W ]0 P2 B7 q, C( j}
# \% h Z8 O* {8 \! I$ Z- O3 }2 W8 s& f' Y) X2 \! ~7 t( b
void CIM::UpdateShow()# [' J: ^* }/ [" F2 i j
{1 C. K# v: [& T& Q) K# A2 D
POINT pt;8 L! ?9 A% C7 o6 \, i* l/ i- B
pt.y = 450;
+ N0 w$ i: s$ b/ M9 _" G1 f9 T pt.x = 400; * O5 O/ {9 H7 ^
ttffont.SetSurface( DD_GetBackScreen() );2 u2 E) r# o2 M6 S2 q
ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述' J) ^ C" h9 |7 {7 k9 d, ?4 P
; {& \( C' l! W pt.y = 420;+ B( |! g- w& {& ~: `% g/ h- u, D
pt.x = 20;
: J7 F% b5 K) L, R& V ttffont.ShowText( m_cCandidateList,&pt );* i) `, R8 S5 Y
. f/ N# x& A- o pt.y = 450;, E# I5 C; X! a
pt.x = 20;
2 U, v. t1 {0 \$ z if( *m_lpszImeInput == '\0' ), l( [' V8 V2 c3 ^. E
return;
1 b' I3 j, B7 \
$ Z* [5 x* q: \- v" ^* J+ G9 V ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字0 C: Z0 n. F: t2 [2 f9 _% X$ O
}
# W! {# u1 ^# I E# `6 k+ a+ D* H" K5 T
LPSTR CIM::GetResultString()
* U. e9 g- C+ S7 J- i" F* j2 }{( W* x/ I4 r5 f6 l6 E" m
return m_lpszImeInput;8 v, N! q z& K- k0 F
}
$ l8 I3 d6 D$ [, f- T5 z! c! G; ?4 p/ \
BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)1 {7 a9 u# I" f
{' F0 C4 g% O# V4 F) G6 s
if( !m_lpCandList )$ x9 n4 L8 Y& z O# e, b3 S
return FALSE;
; u% [) P$ A- F+ l- Q4 k/ t& v% L1 Q
% X0 F+ e9 I: r# d if( m_lpCandList->dwCount>0 )
; t+ X3 H+ ]9 M& y: o! V {/ R6 e/ @9 r" l0 O
LPDWORD lpdwOffset;( l7 g8 U3 N: F7 p
$ n. D2 w( B: n, C. M* @$ C) N; Q) i lpdwOffset = &m_lpCandList->dwOffset[0];; k; ]0 B6 a3 F- \% M: F4 Y3 b/ V
3 Q4 \$ x1 Q. k0 h
lpdwOffset += m_lpCandList->dwPageStart;# Z& n) }! m8 A3 l, e( B L) l
+ R9 {" ~! ?3 T; i+ N: e% M
ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );! N; ]+ u- @' g% X9 D7 s
& Q4 v& {3 X& [
DWORD z=1;$ _# Y: K2 B4 ]' {1 g
for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++) + H9 b0 \2 |; w" Z/ Q7 E
{
# Z6 V5 J" P( o% v LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
4 Q3 |. ?# ^* Y% o* {+ R" } char buf[255];# I( {/ V# h7 M3 B- o9 s% P
sprintf( buf,"%d.%s",z,lpstr );* y+ S. l+ n+ Z0 M5 l
strcat( m_cCandidateList,buf );
" j3 [9 T; H9 W5 Y3 J9 V: X z++;. O+ @# V; l! U4 V6 ^& p0 t: u* b
}
% c$ @; q$ b) }7 f% E1 a
3 m" F3 _$ U( n) }' t return TRUE;
5 h& ~% ~5 [2 k' a0 ~& S6 p }( Y+ D4 V: i( C8 W- L" E2 ?& U
6 v# b+ H8 E: O
return FALSE;( T- ~" S1 L7 g2 o6 Z
}) H+ Y' I& h" p7 b3 z& K
+ i. |2 S: k" h* Y& \BOOL CIM::ImeIsOpen()
" N% L2 I' j' R% S. R+ ^{/ H1 a( w$ O+ f/ a- a8 O
return ImmIsIME( GetKeyboardLayout(0) );
1 U- R7 f) P h7 F# `: N( w} |
|