00133 {
00134 HWND hDefIMEWnd;
00135
int i, j;
00136
static BYTE bp1stInterim = 0;
00137
static BYTE bp2ndInterim = 0;
00138
BOOL bAnsiWnd;
00139 HWND
hWnd;
00140 WCHAR wchUni;
00141
CHAR chAnsi[2];
00142
BYTE bchLow, bchHi, bCh;
00143
BOOL (WINAPI* fpPostMessage)(HWND
hWnd,
UINT Msg, WPARAM wParam, LPARAM lParam);
00144 LRESULT (WINAPI* fpSendMessage)(HWND
hWnd,
UINT Msg, WPARAM wParam, LPARAM lParam);
00145
00146
hWnd = (HWND)lpIMC->hWnd;
00147
00148 hDefIMEWnd =
ImmGetDefaultIMEWnd(hWnd);
00149
00150 bAnsiWnd = !
IsWindowUnicode(hWnd) ?
TRUE :
FALSE;
00151
if (bAnsiWnd) {
00152 fpPostMessage = PostMessageA;
00153 fpSendMessage = SendMessageA;
00154 }
else {
00155 fpPostMessage = PostMessageW;
00156 fpSendMessage = SendMessageW;
00157 }
00158
00159
for (i = 0; i < iNumMsg; i++) {
00160
00161
switch (pTransMsg[i].message) {
00162
00163
case WM_IME_COMPOSITION :
00164
00165
if (pTransMsg[i].lParam & GCS_RESULTSTR) {
00166
00167 fpPostMessage(hWnd, WM_IME_REPORT, IR_STRINGSTART, 0L);
00168
00169
for (j = 0; j < (
int)lpCompStr->dwResultStrLen; j++) {
00170 LPARAM lParam;
00171 bCh = 0;
00172
if (bAnsiIMC) {
00173 bCh = *((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset + j);
00174
if (bAnsiWnd) {
00175
if (IsDBCSLeadByte(bCh)) {
00176 lParam = (bCh >= 0xB0 && bCh <= 0xC8)? 0xFFF10001
L: 0xFFF20001
L;
00177 PostMessageA(hWnd, WM_CHAR, bCh, lParam);
00178 bCh = *((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset + ++j);
00179 }
else
00180 lParam = 1
L;
00181 PostMessageA(hWnd, WM_CHAR, bCh, lParam);
00182 }
else {
00183 chAnsi[0] = bCh;
00184 chAnsi[1] = *((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset + ++j);
00185
00186 MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, chAnsi, 2, &wchUni, 1);
00187
00188 PostMessageW(hWnd, WM_CHAR, wchUni, lParam);
00189 }
00190 }
else {
00191 bCh = *((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset + j *
sizeof(WCHAR));
00192 wchUni = bCh | ( *((LPSTR)lpCompStr + lpCompStr->dwResultStrOffset +
00193 (j *
sizeof(WCHAR) + 1)) << 8);
00194
00195
if (bAnsiWnd) {
00196 WideCharToMultiByte(CP_ACP, 0, &wchUni, 1, chAnsi, 2, NULL, NULL);
00197
00198 bchLow = chAnsi[0];
00199 bchHi = chAnsi[0];
00200
00201
if (IsDBCSLeadByte(bchLow)) {
00202 lParam = (bchLow >= 0xB0 && bchLow <= 0xC8) ? 0xFFF10001
L: 0xFFF20001
L;
00203 PostMessageA(hWnd, WM_CHAR, bchLow, lParam);
00204 bchHi = chAnsi[1];
00205 }
else
00206 lParam = 1
L;
00207
00208 PostMessageA(hWnd, WM_CHAR, bchHi, lParam);
00209 }
else {
00210 PostMessageW(hWnd, WM_CHAR, wchUni, lParam);
00211 }
00212 }
00213 }
00214
00215 fpPostMessage(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00216
00217 }
else {
00218
00219
if (pTransMsg[i].wParam) {
00220
00221 fpPostMessage(hWnd, WM_IME_REPORT, IR_STRINGSTART, 0L);
00222
00223 bp1stInterim =
HIBYTE(LOWORD(pTransMsg[i].wParam));
00224 bp2ndInterim =
LOBYTE(LOWORD(pTransMsg[i].wParam));
00225
00226
if (bAnsiIMC) {
00227
if (bAnsiWnd) {
00228 PostMessageA(hWnd, WM_INTERIM, bp1stInterim, 0x00F00001L);
00229 PostMessageA(hWnd, WM_INTERIM, bp2ndInterim, 0x00F00001L);
00230 PostMessageA(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00231 }
else {
00232 chAnsi[0] = bp1stInterim;
00233 chAnsi[1] = bp2ndInterim;
00234
00235
if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, chAnsi, 2, &wchUni, 1))
00236 PostMessageW(hWnd, WM_INTERIM, wchUni, 0x00F00001L);
00237 PostMessageW(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00238 }
00239
00240 }
else {
00241
if (bAnsiWnd) {
00242 wchUni = (bp1stInterim << 8) | bp2ndInterim;
00243 WideCharToMultiByte(CP_ACP, 0, &wchUni, 1, chAnsi, 2, NULL, NULL);
00244
00245 bchLow = chAnsi[0];
00246 bchHi = chAnsi[1];
00247
00248 PostMessageA(hWnd, WM_INTERIM, bchLow, 0x00F00001L);
00249 PostMessageA(hWnd, WM_INTERIM, bchHi, 0x00F00001L);
00250 PostMessageA(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00251 }
else {
00252 PostMessageW(hWnd, WM_INTERIM, pTransMsg[i].wParam, 0x00F00001L);
00253 PostMessageW(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00254 }
00255 }
00256 fpSendMessage(hDefIMEWnd, WM_IME_ENDCOMPOSITION, 0, 0L);
00257
00258 }
else {
00259
00260 fpPostMessage(hWnd, WM_IME_REPORT, IR_STRINGSTART, 0L);
00261
00262
if (bAnsiIMC) {
00263
if (bAnsiWnd) {
00264 PostMessageA(hWnd, WM_CHAR, bp1stInterim, 0xFFF10001L);
00265 PostMessageA(hWnd, WM_CHAR, bp2ndInterim, 0xFFF10001L);
00266 PostMessageA(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00267 PostMessageA(hWnd, WM_KEYDOWN, VK_BACK, 0x000E0001L);
00268 }
else {
00269 chAnsi[0] = bp1stInterim;
00270 chAnsi[1] = bp2ndInterim;
00271
00272
if (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, chAnsi, 2, &wchUni, 1))
00273 PostMessageW(hWnd, WM_CHAR, wchUni, 0xFFF10001L);
00274
00275 PostMessageW(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00276 PostMessageW(hWnd, WM_KEYDOWN, VK_BACK, 0x000E0001L);
00277 }
00278 }
else {
00279
if (bAnsiWnd) {
00280 wchUni = (bp1stInterim << 8 ) | bp2ndInterim;
00281
00282 WideCharToMultiByte(CP_ACP, 0, &wchUni, 1, chAnsi, 2, NULL, NULL);
00283
00284 bchLow = chAnsi[0];
00285 bchHi = chAnsi[1];
00286
00287 PostMessageA(hWnd, WM_CHAR, bchLow, 0xFFF10001L);
00288 PostMessageA(hWnd, WM_CHAR, bchHi, 0xFFF10001L);
00289 PostMessageA(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00290 PostMessageA(hWnd, WM_KEYDOWN, VK_BACK, 0x000E0001L);
00291 }
else {
00292 wchUni = bp1stInterim | (bp2ndInterim << 8);
00293
00294 PostMessageW(hWnd, WM_CHAR, wchUni, 0xFFF10001L);
00295 PostMessageW(hWnd, WM_IME_REPORT, IR_STRINGEND, 0L);
00296 PostMessageW(hWnd, WM_KEYDOWN, VK_BACK, 0x000E0001L);
00297 }
00298 }
00299 }
00300 }
00301
break;
00302
00303
case WM_IME_STARTCOMPOSITION :
00304
case WM_IME_ENDCOMPOSITION :
00305
break;
00306
00307
case WM_IME_KEYDOWN:
00308 fpPostMessage(hWnd, WM_KEYDOWN, LOWORD(pTransMsg[i].wParam),
00309 pTransMsg[i].lParam);
00310
break;
00311
00312
case WM_IME_KEYUP:
00313 fpPostMessage(hWnd, WM_KEYUP, LOWORD(pTransMsg[i].wParam),
00314 pTransMsg[i].lParam);
00315
break;
00316
00317
default :
00318 fpSendMessage(hDefIMEWnd, pTransMsg[i].message,
00319 pTransMsg[i].wParam, pTransMsg[i].lParam);
00320
break;
00321 }
00322 }
00323
00324
return 0;
00325 }