ReactOS 0.4.16-dev-2613-g9533ad7
keymsg.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS IMM32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Implementing IMM32 keys and messages
5 * COPYRIGHT: Copyright 1998 Patrik Stridvall
6 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
7 * Copyright 2017 James Tabor <james.tabor@reactos.org>
8 * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
9 * Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
10 */
11
12#include "precomp.h"
13#include <ime.h>
14
16
17static BOOL
19{
20 HKL hOldKL, LayoutList[32], hFoundKL = NULL;
21 UINT iLayout, nLayoutCount;
22
23 /* Get the previous layout */
25
26 /* Get the layout list */
27 nLayoutCount = GetKeyboardLayoutList(_countof(LayoutList), LayoutList);
28
29 /* Is there hOldKL in the list in the specified language ID? */
30 if (hOldKL && (LangID == 0 || LOWORD(hOldKL) == LangID))
31 {
32 for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
33 {
34 if (LayoutList[iLayout] == hOldKL)
35 {
36 hFoundKL = hOldKL;
37 break;
38 }
39 }
40 }
41
42 if (hFoundKL == NULL) /* Not found? */
43 {
44 /* Is there the keyboard layout of another kind in LangID? */
45 for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
46 {
47 if (bNowIME == ImmIsIME(LayoutList[iLayout])) /* Same kind? */
48 continue;
49
50 if (LangID == 0 || LangID == LOWORD(LayoutList[iLayout]))
51 {
52 hFoundKL = LayoutList[iLayout];
53 break;
54 }
55 }
56 }
57
58 if (hFoundKL && hKL != hFoundKL) /* Found and different layout */
59 {
60 PostMessageW(hWnd, WM_INPUTLANGCHANGEREQUEST, 1, (LPARAM)hFoundKL);
61 }
62
63 return ImmIsIME(hFoundKL);
64}
65
66/* Open or close the IME on Chinese or Taiwanese */
67static BOOL
69{
71 BOOL fOpen;
72
74 return FALSE;
75
76 if (LOWORD(hKL) != LangID || !ImmIsIME(hKL))
77 {
79 return TRUE;
80 }
81
82 pIC = ImmLockIMC(hIMC);
83 if (IS_NULL_UNEXPECTEDLY(pIC))
84 return TRUE;
85
86 fOpen = pIC->fOpen;
87 ImmUnlockIMC(hIMC);
88
89 if (fOpen)
90 Imm32ImeNonImeToggle(hIMC, hKL, hWnd, TRUE, 0);
91 else
93
94 return TRUE;
95}
96
97/* Toggle shape mode on Chinese or Taiwanese */
98static BOOL
100{
101 LPINPUTCONTEXT pIC;
102 BOOL fOpen;
103 DWORD dwConversion, dwSentence;
104
105 if (hWnd == NULL || !ImmIsIME(hKL))
106 return FALSE;
107
108 pIC = ImmLockIMC(hIMC);
109 if (IS_NULL_UNEXPECTEDLY(pIC))
110 return TRUE;
111
112 fOpen = pIC->fOpen;
113 if (fOpen)
114 {
115 dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE);
116 dwSentence = pIC->fdwSentence;
117 }
118
119 ImmUnlockIMC(hIMC);
120
121 if (fOpen)
122 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
123 else
124 ImmSetOpenStatus(hIMC, TRUE);
125
126 return TRUE;
127}
128
129static BOOL
131{
132 LPINPUTCONTEXT pIC;
133 BOOL fOpen;
134 DWORD dwConversion, dwSentence;
135
136 if (hWnd == NULL || !ImmIsIME(hKL))
137 return FALSE;
138
139 pIC = ImmLockIMC(hIMC);
140 if (IS_NULL_UNEXPECTEDLY(pIC))
141 return TRUE;
142
143 fOpen = pIC->fOpen;
144 if (fOpen)
145 {
146 dwConversion = (pIC->fdwConversion ^ IME_CMODE_SYMBOL);
147 dwSentence = pIC->fdwSentence;
148 }
149
150 ImmUnlockIMC(hIMC);
151
152 if (fOpen)
153 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
154 else
155 ImmSetOpenStatus(hIMC, TRUE);
156
157 return TRUE;
158}
159
160/* Open or close Japanese IME */
161static BOOL
163{
164 BOOL fOpen;
166
167 if (LOWORD(hKL) == LANGID_JAPANESE && ImmIsIME(hKL)) /* Japanese IME is selected */
168 {
169 fOpen = ImmGetOpenStatus(hIMC);
170 ImmSetOpenStatus(hIMC, !fOpen);
171 return TRUE;
172 }
173
174 /* Japanese IME is not selected. Select now */
176 {
177 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
178 if (pIC)
179 {
181 ImmUnlockIMC(hIMC);
182 }
183 }
184
185 return TRUE;
186}
187
188static BOOL
190{
191 LPINPUTCONTEXT pIC;
192 DWORD dwConversion, dwSentence;
193
194 pIC = ImmLockIMC(hIMC);
195 if (IS_NULL_UNEXPECTEDLY(pIC))
196 return FALSE;
197
198 dwConversion = (pIC->fdwConversion ^ IME_CMODE_FULLSHAPE);
199 dwSentence = pIC->fdwSentence;
200 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
201
203 ImmSetOpenStatus(hIMC, TRUE);
204 else
205 ImmSetOpenStatus(hIMC, FALSE);
206
207 ImmUnlockIMC(hIMC);
208 return TRUE;
209}
210
211static BOOL
213{
214 LPINPUTCONTEXT pIC;
215 DWORD dwConversion, dwSentence;
216
217 pIC = ImmLockIMC(hIMC);
218 if (IS_NULL_UNEXPECTEDLY(pIC))
219 return FALSE;
220
221 dwConversion = (pIC->fdwConversion ^ IME_CMODE_HANJACONVERT);
222 dwSentence = pIC->fdwSentence;
223 ImmUnlockIMC(hIMC);
224
225 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
226 return TRUE;
227}
228
229static BOOL
231{
232 LPINPUTCONTEXT pIC;
233 DWORD dwConversion, dwSentence;
234 BOOL fOpen;
235
236 pIC = ImmLockIMC(hIMC);
237 if (IS_NULL_UNEXPECTEDLY(pIC))
238 return FALSE;
239
240 dwConversion = (pIC->fdwConversion ^ IME_CMODE_NATIVE);
241 dwSentence = pIC->fdwSentence;
242 ImmSetConversionStatus(hIMC, dwConversion, dwSentence);
243
244 fOpen = ((pIC->fdwConversion & (IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE)) != 0);
245 ImmSetOpenStatus(hIMC, fOpen);
246
247 ImmUnlockIMC(hIMC);
248 return TRUE;
249}
250
251static BOOL
252Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID)
253{
254 PIMEDPI pImeDpi;
255 BOOL ret;
256
257 if (hIMC && IS_CROSS_THREAD_HIMC(hIMC))
258 return FALSE;
259
260 switch (dwHotKeyID)
261 {
264
266 return Imm32CShapeToggle(hIMC, hKL, hWnd);
267
269 return Imm32CSymbolToggle(hIMC, hKL, hWnd);
270
272 return Imm32JCloseOpen(hIMC, hKL, hWnd);
273
275 return Imm32KShapeToggle(hIMC);
276
278 return Imm32KHanjaConvert(hIMC);
279
281 return Imm32KEnglish(hIMC);
282
285
287 return Imm32CShapeToggle(hIMC, hKL, hWnd);
288
290 return Imm32CSymbolToggle(hIMC, hKL, hWnd);
291
292 default:
293 WARN("0x%X\n", dwHotKeyID);
294 break;
295 }
296
297 if (dwHotKeyID < IME_HOTKEY_PRIVATE_FIRST || IME_HOTKEY_PRIVATE_LAST < dwHotKeyID)
298 return FALSE;
299
300 pImeDpi = ImmLockImeDpi(hKL);
301 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
302 return FALSE;
303
304 ret = (BOOL)pImeDpi->ImeEscape(hIMC, IME_ESC_PRIVATE_HOTKEY, &dwHotKeyID);
305 ImmUnlockImeDpi(pImeDpi);
306 return ret;
307}
308
309static BOOL
311 _In_opt_ HWND hWndIME,
312 _In_ UINT msg,
315 _In_ BOOL bAnsi)
316{
317 switch (msg)
318 {
319 case WM_IME_STARTCOMPOSITION: case WM_IME_ENDCOMPOSITION:
320 case WM_IME_COMPOSITION: case WM_IME_SETCONTEXT: case WM_IME_NOTIFY:
322 break;
323 default:
324 return FALSE;
325 }
326
327 if (IS_NULL_UNEXPECTEDLY(hWndIME))
328 return TRUE;
329
330 if (bAnsi)
331 SendMessageA(hWndIME, msg, wParam, lParam);
332 else
333 SendMessageW(hWndIME, msg, wParam, lParam);
334
335 return TRUE;
336}
337
338static BOOL CALLBACK
340 _In_ HIMC hIMC,
342{
343 HWND hWnd;
345
347
348 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
349 if (IS_NULL_UNEXPECTEDLY(pIC))
350 return TRUE;
351
352 hWnd = pIC->hWnd;
353 if (!IsWindow(hWnd))
354 goto Quit;
355
356 TRACE("dwChange: 0x%08X\n", pIC->dwChange);
357
363 NtUserNotifyIMEStatus(hWnd, pIC->fOpen, pIC->fdwConversion);
366Quit:
367 pIC->dwChange = 0;
368 ImmUnlockIMC(hIMC); // ??? Windows doesn't unlock here
369 return TRUE;
370}
371
373{
374 return ImmEnumInputContext((bProcess ? -1 : 0), Imm32SendNotificationProc, 0);
375}
376
377static LRESULT
378Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI)
379{
380 HWND hWnd;
381 DWORD ret = 0, dwCharPos, cchCompStr, dwSize;
382 LPVOID pCS, pTempData = pData;
383 LPRECONVERTSTRING pRS;
384 LPIMECHARPOSITION pICP;
385 PCLIENTIMC pClientImc;
386 UINT uCodePage = CP_ACP;
387 BOOL bAnsiWnd = !!(pWnd->state & WNDS_ANSIWINDOWPROC);
388 static const size_t acbData[7 * 2] =
389 {
390 /* UNICODE */
391 sizeof(COMPOSITIONFORM), sizeof(CANDIDATEFORM), sizeof(LOGFONTW),
392 sizeof(RECONVERTSTRING), sizeof(RECONVERTSTRING),
393 sizeof(IMECHARPOSITION), sizeof(RECONVERTSTRING),
394 /* ANSI */
395 sizeof(COMPOSITIONFORM), sizeof(CANDIDATEFORM), sizeof(LOGFONTA),
396 sizeof(RECONVERTSTRING), sizeof(RECONVERTSTRING),
397 sizeof(IMECHARPOSITION), sizeof(RECONVERTSTRING),
398 };
399
400 if (dwCommand == 0 || dwCommand > IMR_DOCUMENTFEED)
401 {
402 ERR("Out of boundary\n");
403 return 0; /* Out of range */
404 }
405
406 dwSize = acbData[bAnsiAPI * 7 + dwCommand - 1];
408 {
409 ERR("\n");
410 return 0; /* Invalid pointer */
411 }
412
413 /* Sanity check */
414 switch (dwCommand)
415 {
416 case IMR_RECONVERTSTRING: case IMR_DOCUMENTFEED:
417 pRS = pData;
418 if (pRS && (pRS->dwVersion != 0 || pRS->dwSize < sizeof(RECONVERTSTRING)))
419 {
420 ERR("Invalid pRS\n");
421 return 0;
422 }
423 break;
424
425 case IMR_CONFIRMRECONVERTSTRING:
426 pRS = pData;
427 if (!pRS || pRS->dwVersion != 0)
428 {
429 ERR("Invalid pRS\n");
430 return 0;
431 }
432 break;
433
434 default:
436 return 0;
437 break;
438 }
439
440 pClientImc = ImmLockClientImc(hIMC);
441 if (pClientImc)
442 {
443 uCodePage = pClientImc->uCodePage;
444 ImmUnlockClientImc(pClientImc);
445 }
446
447 /* Prepare */
448 switch (dwCommand)
449 {
450 case IMR_COMPOSITIONFONT:
451 if (bAnsiAPI == bAnsiWnd)
452 goto DoIt; /* No conversion needed */
453
454 if (bAnsiWnd)
455 pTempData = ImmLocalAlloc(0, sizeof(LOGFONTA));
456 else
457 pTempData = ImmLocalAlloc(0, sizeof(LOGFONTW));
458
459 if (IS_NULL_UNEXPECTEDLY(pTempData))
460 return 0;
461 break;
462
463 case IMR_RECONVERTSTRING: case IMR_CONFIRMRECONVERTSTRING: case IMR_DOCUMENTFEED:
464 if (bAnsiAPI == bAnsiWnd || !pData)
465 goto DoIt; /* No conversion needed */
466
467 if (bAnsiWnd)
469 else
471
472 pTempData = ImmLocalAlloc(0, ret + sizeof(WCHAR));
473 if (IS_NULL_UNEXPECTEDLY(pTempData))
474 return 0;
475
476 pRS = pTempData;
477 pRS->dwSize = ret;
478 pRS->dwVersion = 0;
479
480 if (dwCommand == IMR_CONFIRMRECONVERTSTRING)
481 {
482 if (bAnsiWnd)
483 ret = Imm32ReconvertAnsiFromWide(pTempData, pData, uCodePage);
484 else
485 ret = Imm32ReconvertWideFromAnsi(pTempData, pData, uCodePage);
486 }
487 break;
488
489 case IMR_QUERYCHARPOSITION:
490 if (bAnsiAPI == bAnsiWnd)
491 goto DoIt; /* No conversion needed */
492
493 pICP = pData;
494 dwCharPos = pICP->dwCharPos;
495
496 if (bAnsiAPI)
497 {
498 cchCompStr = ImmGetCompositionStringA(hIMC, GCS_COMPSTR, NULL, 0);
499 if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
500 return 0;
501
502 pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(CHAR));
503 if (IS_NULL_UNEXPECTEDLY(pCS))
504 return 0;
505
506 ImmGetCompositionStringA(hIMC, GCS_COMPSTR, pCS, cchCompStr);
507 pICP->dwCharPos = IchWideFromAnsi(pICP->dwCharPos, pCS, uCodePage);
508 }
509 else
510 {
511 cchCompStr = ImmGetCompositionStringW(hIMC, GCS_COMPSTR, NULL, 0);
512 if (IS_ZERO_UNEXPECTEDLY(cchCompStr))
513 return 0;
514
515 pCS = ImmLocalAlloc(0, (cchCompStr + 1) * sizeof(WCHAR));
516 if (IS_NULL_UNEXPECTEDLY(pCS))
517 return 0;
518
519 ImmGetCompositionStringW(hIMC, GCS_COMPSTR, pCS, cchCompStr);
520 pICP->dwCharPos = IchAnsiFromWide(pICP->dwCharPos, pCS, uCodePage);
521 }
522
523 ImmLocalFree(pCS);
524 break;
525
526 default:
527 WARN("0x%X\n", dwCommand);
528 break;
529 }
530
531DoIt:
532 /* The main task */
533 hWnd = pWnd->head.h;
534 if (bAnsiWnd)
535 ret = SendMessageA(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData);
536 else
537 ret = SendMessageW(hWnd, WM_IME_REQUEST, dwCommand, (LPARAM)pTempData);
538
539 if (bAnsiAPI == bAnsiWnd)
540 goto Quit; /* No conversion needed */
541
542 /* Get back to caller */
543 switch (dwCommand)
544 {
545 case IMR_COMPOSITIONFONT:
546 if (bAnsiAPI)
547 LogFontWideToAnsi(pTempData, pData);
548 else
549 LogFontAnsiToWide(pTempData, pData);
550 break;
551
552 case IMR_RECONVERTSTRING: case IMR_DOCUMENTFEED:
553 if (!ret)
554 break;
555
556 if (ret < sizeof(RECONVERTSTRING))
557 {
558 ret = 0;
559 break;
560 }
561
562 if (pTempData)
563 {
564 if (bAnsiWnd)
565 ret = Imm32ReconvertWideFromAnsi(pData, pTempData, uCodePage);
566 else
567 ret = Imm32ReconvertAnsiFromWide(pData, pTempData, uCodePage);
568 }
569 break;
570
571 case IMR_QUERYCHARPOSITION:
572 pICP->dwCharPos = dwCharPos;
573 break;
574
575 default:
576 WARN("0x%X\n", dwCommand);
577 break;
578 }
579
580Quit:
581 if (pTempData != pData)
582 ImmLocalFree(pTempData);
583 return ret;
584}
585
586static LRESULT
588 _In_ HIMC hIMC,
591 _In_ BOOL bAnsi)
592{
593 LRESULT ret = 0;
594 LPINPUTCONTEXT pIC;
595 HWND hWnd;
596 PWND pWnd = NULL;
597
599 return FALSE;
600
601 pIC = ImmLockIMC(hIMC);
602 if (IS_NULL_UNEXPECTEDLY(pIC))
603 return FALSE;
604
605 hWnd = pIC->hWnd;
606 if (hWnd)
607 pWnd = ValidateHwnd(hWnd);
608
609 if (pWnd && pWnd->head.pti == Imm32CurrentPti())
610 ret = Imm32ProcessRequest(hIMC, pWnd, (DWORD)wParam, (LPVOID)lParam, bAnsi);
611
612 ImmUnlockIMC(hIMC);
613 return ret;
614}
615
616/***********************************************************************
617 * ImmIsUIMessageA (IMM32.@)
618 */
621 _In_opt_ HWND hWndIME,
622 _In_ UINT msg,
625{
626 TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
627 return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, TRUE);
628}
629
630/***********************************************************************
631 * ImmIsUIMessageW (IMM32.@)
632 */
635 _In_opt_ HWND hWndIME,
636 _In_ UINT msg,
639{
640 TRACE("(%p, 0x%X, %p, %p)\n", hWndIME, msg, wParam, lParam);
641 return ImmIsUIMessageAW(hWndIME, msg, wParam, lParam, FALSE);
642}
643
644/***********************************************************************
645 * ImmGetHotKey(IMM32.@)
646 */
649 _In_ DWORD dwHotKey,
650 _Out_ LPUINT lpuModifiers,
651 _Out_ LPUINT lpuVKey,
652 _Out_opt_ LPHKL lphKL)
653{
654 TRACE("(0x%lX, %p, %p, %p)\n", dwHotKey, lpuModifiers, lpuVKey, lphKL);
655 if (lpuModifiers && lpuVKey)
656 return NtUserGetImeHotKey(dwHotKey, lpuModifiers, lpuVKey, lphKL);
657 return FALSE;
658}
659
660/***********************************************************************
661 * ImmWINNLSGetIMEHotkey (IMM32.@)
662 */
665{
666 TRACE("(%p)\n", hwndIme);
667 UNREFERENCED_PARAMETER(hwndIme);
668 return 0; /* This is correct. This function of Windows just returns zero. */
669}
670
671/***********************************************************************
672 * ImmSimulateHotKey (IMM32.@)
673 */
676 _In_ HWND hWnd,
677 _In_ DWORD dwHotKeyID)
678{
679 HIMC hIMC;
681 HKL hKL;
682 BOOL ret;
683
684 TRACE("(%p, 0x%lX)\n", hWnd, dwHotKeyID);
685
686 hIMC = ImmGetContext(hWnd);
689 ret = Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID);
690 ImmReleaseContext(hWnd, hIMC);
691 return ret;
692}
693
694/***********************************************************************
695 * ImmGetVirtualKey (IMM32.@)
696 */
699{
700 HIMC hIMC;
703
704 TRACE("(%p)\n", hWnd);
705
706 hIMC = ImmGetContext(hWnd);
707 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
708 if (IS_NULL_UNEXPECTEDLY(pIC))
709 return ret;
710
711 if (pIC->bNeedsTrans)
712 ret = pIC->nVKey;
713
714 ImmUnlockIMC(hIMC);
715 return ret;
716}
717
718/***********************************************************************
719 * ImmGetAppCompatFlags (IMM32.@)
720 */
723{
724 TRACE("(%p)\n", hIMC);
725
726 PCLIENTIMC pClientIMC = ImmLockClientImc(hIMC);
727 if (IS_NULL_UNEXPECTEDLY(pClientIMC))
728 return 0;
729
730 DWORD dwCompatFlags = pClientIMC->dwCompatFlags;
731 ImmUnlockClientImc(pClientIMC);
732 return (dwCompatFlags | g_aimm_compat_flags);
733}
734
735/***********************************************************************
736 * ImmProcessKey(IMM32.@)
737 * ( Undocumented, called from user32.dll )
738 */
741 _In_ HWND hWnd,
742 _In_ HKL hKL,
743 _In_ UINT vKey,
745 _In_ DWORD dwHotKeyID)
746{
747 DWORD ret = 0;
748 HIMC hIMC;
749 PIMEDPI pImeDpi;
751 BYTE KeyState[256];
752 BOOL bLowWordOnly = FALSE, bSkipThisKey = FALSE, bHotKeyDone = TRUE;
753
754 TRACE("(%p, %p, 0x%X, %p, 0x%lX)\n", hWnd, hKL, vKey, lParam, dwHotKeyID);
755
756 /* Process the key by the IME */
757 hIMC = ImmGetContext(hWnd);
758 pImeDpi = ImmLockImeDpi(hKL);
759 if (pImeDpi)
760 {
761 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
762 if (pIC)
763 {
764 if ((LOBYTE(vKey) == VK_PACKET) &&
766 {
767 if (ImeDpi_IsUnicode(pImeDpi))
768 {
769 bLowWordOnly = TRUE;
770 }
771 else
772 {
773 if (pIC->fOpen)
775
776 bSkipThisKey = TRUE;
777 }
778 }
779
780 if (!bSkipThisKey && GetKeyboardState(KeyState))
781 {
782 UINT vk = (bLowWordOnly ? LOWORD(vKey) : vKey);
783 if (pImeDpi->ImeProcessKey(hIMC, vk, lParam, KeyState))
784 {
785 pIC->bNeedsTrans = TRUE;
786 pIC->nVKey = vKey;
788 }
789 }
790
791 ImmUnlockIMC(hIMC);
792 }
793
794 ImmUnlockImeDpi(pImeDpi);
795 }
796
797 /* Process the hot-key if necessary */
798 if (!CtfImmIsCiceroStartedInThread()) /* Not Cicero? */
799 {
800 /* Process IMM IME hotkey */
801 if ((dwHotKeyID == INVALID_HOTKEY_ID) || !Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID))
802 bHotKeyDone = FALSE;
803 }
804 else if (!CtfImeProcessCicHotkey(hIMC, vKey, lParam)) /* CTF IME not processed the hotkey? */
805 {
806 /* Process IMM IME hotkey */
807 if (!IS_IME_HKL(hKL) ||
808 ((dwHotKeyID == INVALID_HOTKEY_ID) || !Imm32ProcessHotKey(hWnd, hIMC, hKL, dwHotKeyID)))
809 {
810 bHotKeyDone = FALSE;
811 }
812 }
813
814 if (bHotKeyDone && ((vKey != VK_KANJI) || (dwHotKeyID != IME_JHOTKEY_CLOSE_OPEN)))
815 ret |= IPHK_HOTKEY;
816
818 {
819 /* The key has been processed by IME's ImeProcessKey */
821 if ((PRIMARYLANGID(wLangID) == LANG_KOREAN) &&
822 ((vKey == VK_PROCESSKEY) || (ret & IPHK_HOTKEY)))
823 {
824 /* Korean don't want VK_PROCESSKEY and IME hot-keys */
825 }
826 else
827 {
828 /* Add WM_KEYDOWN:VK_PROCESSKEY message */
830
831 ret &= ~IPHK_PROCESSBYIME;
833 }
834 }
835
836 ImmReleaseContext(hWnd, hIMC);
837 return ret; /* Returns IPHK_... flags */
838}
839
840/***********************************************************************
841 * ImmSystemHandler(IMM32.@)
842 */
845 _In_ HIMC hIMC,
848{
849 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
850
851 switch (wParam)
852 {
855 return 0;
856
859 return 0;
860
861 case IMS_SETLANGBAND:
864
865 default:
866 WARN("%p\n", wParam);
867 return 0;
868 }
869}
870
871/***********************************************************************
872 * ImmGenerateMessage(IMM32.@)
873 */
876{
877 PCLIENTIMC pClientImc;
878 LPINPUTCONTEXT pIC;
879 LPTRANSMSG pMsgs = NULL, pTrans = NULL, pItem;
880 HWND hWnd;
881 DWORD dwIndex, dwCount, cbTrans;
882 HIMCC hMsgBuf = NULL;
883 BOOL bAnsi;
884
885 TRACE("(%p)\n", hIMC);
886
887 if (IS_CROSS_THREAD_HIMC(hIMC))
888 return FALSE;
889
890 pClientImc = ImmLockClientImc(hIMC);
891 if (IS_NULL_UNEXPECTEDLY(pClientImc))
892 return FALSE;
893
894 bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
895 ImmUnlockClientImc(pClientImc);
896
897 pIC = ImmLockIMC(hIMC);
898 if (IS_NULL_UNEXPECTEDLY(pIC))
899 return FALSE;
900
901 dwCount = pIC->dwNumMsgBuf;
902 if (dwCount == 0)
903 goto Quit;
904
905 hMsgBuf = pIC->hMsgBuf;
906 pMsgs = ImmLockIMCC(hMsgBuf);
907 if (IS_NULL_UNEXPECTEDLY(pMsgs))
908 goto Quit;
909
910 cbTrans = dwCount * sizeof(TRANSMSG);
911 pTrans = ImmLocalAlloc(0, cbTrans);
912 if (IS_NULL_UNEXPECTEDLY(pTrans))
913 goto Quit;
914
915 RtlCopyMemory(pTrans, pMsgs, cbTrans);
916
917#ifdef IMM_WIN3_SUPPORT
918 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
919 {
921 WORD wLang = PRIMARYLANGID(LangID);
922
923 /* translate the messages if Japanese or Korean */
924 if (wLang == LANG_JAPANESE ||
925 (wLang == LANG_KOREAN && NtUserGetAppImeLevel(pIC->hWnd) == 3))
926 {
927 dwCount = WINNLSTranslateMessage(dwCount, pTrans, hIMC, bAnsi, wLang);
928 }
929 }
930#endif
931
932 /* send them */
933 hWnd = pIC->hWnd;
934 pItem = pTrans;
935 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex, ++pItem)
936 {
937 SendMessageW(hWnd, pItem->message, pItem->wParam, pItem->lParam);
938 }
939
941
942Quit:
943 ImmLocalFree(pTrans);
944 if (hMsgBuf && pMsgs)
945 ImmUnlockIMCC(hMsgBuf);
946 pIC->dwNumMsgBuf = 0; /* done */
947 ImmUnlockIMC(hIMC);
948 return TRUE;
949}
950
951static VOID
953 _In_ HWND hwnd,
954 _In_ HIMC hIMC,
955 _In_ DWORD dwCount,
956 _In_ LPTRANSMSG lpTransMsg)
957{
958 DWORD dwIndex;
959 PCLIENTIMC pClientImc;
960 LPTRANSMSG pNewTransMsg = lpTransMsg, pItem;
961 BOOL bAnsi;
962
963 pClientImc = ImmLockClientImc(hIMC);
964 if (IS_NULL_UNEXPECTEDLY(pClientImc))
965 return;
966
967 bAnsi = !(pClientImc->dwFlags & CLIENTIMC_WIDE);
968 ImmUnlockClientImc(pClientImc);
969
970#ifdef IMM_WIN3_SUPPORT
971 if (GetWin32ClientInfo()->dwExpWinVer < _WIN32_WINNT_NT4) /* old version (3.x)? */
972 {
974 WORD Lang = PRIMARYLANGID(LangID);
975
976 /* translate the messages if Japanese or Korean */
977 if (Lang == LANG_JAPANESE ||
978 (Lang == LANG_KOREAN && NtUserGetAppImeLevel(hwnd) == 3))
979 {
980 DWORD cbTransMsg = dwCount * sizeof(TRANSMSG);
981 pNewTransMsg = ImmLocalAlloc(0, cbTransMsg);
982 if (pNewTransMsg)
983 {
984 RtlCopyMemory(pNewTransMsg, lpTransMsg, cbTransMsg);
985 dwCount = WINNLSTranslateMessage(dwCount, pNewTransMsg, hIMC, bAnsi, Lang);
986 }
987 else
988 {
989 pNewTransMsg = lpTransMsg;
990 }
991 }
992 }
993#endif
994
995 /* post them */
996 pItem = pNewTransMsg;
997 for (dwIndex = 0; dwIndex < dwCount; ++dwIndex, ++pItem)
998 {
999 if (bAnsi)
1000 PostMessageA(hwnd, pItem->message, pItem->wParam, pItem->lParam);
1001 else
1002 PostMessageW(hwnd, pItem->message, pItem->wParam, pItem->lParam);
1003 }
1004
1005#ifdef IMM_WIN3_SUPPORT
1006 if (pNewTransMsg != lpTransMsg)
1007 ImmLocalFree(pNewTransMsg);
1008#endif
1009}
1010
1011/***********************************************************************
1012 * ImmTranslateMessage(IMM32.@)
1013 * ( Undocumented, call internally and from user32.dll )
1014 */
1017 _In_ HWND hwnd,
1018 _In_ UINT msg,
1020 _In_ LPARAM lKeyData)
1021{
1022#define MSG_COUNT 0x100
1023 BOOL ret = FALSE;
1024 INT kret;
1025 LPINPUTCONTEXTDX pIC;
1026 PIMEDPI pImeDpi = NULL;
1028 LPTRANSMSG pTransMsg;
1029 BYTE abKeyState[256];
1030 HIMC hIMC;
1031 HKL hKL;
1032 UINT vk;
1033 DWORD dwThreadId, dwCount, cbList;
1034 WCHAR wch;
1035 WORD wChar;
1036
1037 TRACE("(%p, 0x%X, %p, %p)\n", hwnd, msg, wParam, lKeyData);
1038
1039 /* filter the message */
1040 switch (msg)
1041 {
1042 case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP:
1043 break;
1044 default:
1045 return FALSE;
1046 }
1047
1048 hIMC = ImmGetContext(hwnd);
1049 pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
1050 if (IS_NULL_UNEXPECTEDLY(pIC))
1051 {
1052 ImmReleaseContext(hwnd, hIMC);
1053 return FALSE;
1054 }
1055
1056 if (!pIC->bNeedsTrans) /* is translation needed? */
1057 {
1058 /* directly post them */
1059 dwCount = pIC->dwNumMsgBuf;
1060 if (dwCount == 0)
1061 goto Quit;
1062
1063 pTransMsg = ImmLockIMCC(pIC->hMsgBuf);
1064 if (pTransMsg)
1065 {
1066 ImmPostMessages(hwnd, hIMC, dwCount, pTransMsg);
1067 ImmUnlockIMCC(pIC->hMsgBuf);
1068 ret = TRUE;
1069 }
1070 pIC->dwNumMsgBuf = 0; /* done */
1071 goto Quit;
1072 }
1073 pIC->bNeedsTrans = FALSE; /* clear the flag */
1074
1077 pImeDpi = ImmLockImeDpi(hKL);
1078 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1079 goto Quit;
1080
1081 if (!GetKeyboardState(abKeyState)) /* get keyboard ON/OFF status */
1082 {
1083 WARN("\n");
1084 goto Quit;
1085 }
1086
1087 /* convert a virtual key if IME_PROP_KBD_CHAR_FIRST */
1088 vk = pIC->nVKey;
1090 {
1091 if (ImeDpi_IsUnicode(pImeDpi))
1092 {
1093 wch = 0;
1094 kret = ToUnicode(vk, HIWORD(lKeyData), abKeyState, &wch, 1, 0);
1095 if (kret == 1)
1096 vk = MAKELONG(LOBYTE(vk), wch);
1097 }
1098 else
1099 {
1100 wChar = 0;
1101 kret = ToAsciiEx(vk, HIWORD(lKeyData), abKeyState, &wChar, 0, hKL);
1102 if (kret > 0)
1103 {
1104 if ((BYTE)vk == VK_PACKET)
1105 vk |= (wChar << 8);
1106 else
1107 vk = MAKEWORD(vk, wChar);
1108 }
1109 }
1110 }
1111
1112 /* allocate a list */
1113 cbList = offsetof(TRANSMSGLIST, TransMsg) + MSG_COUNT * sizeof(TRANSMSG);
1114 pList = ImmLocalAlloc(0, cbList);
1116 goto Quit;
1117
1118 /* use IME conversion engine and convert the list */
1119 pList->uMsgCount = MSG_COUNT;
1120 kret = pImeDpi->ImeToAsciiEx(vk, HIWORD(lKeyData), abKeyState, pList, 0, hIMC);
1121 if (kret <= 0)
1122 goto Quit;
1123
1124 /* post them */
1125 if (kret <= MSG_COUNT)
1126 {
1127 ImmPostMessages(hwnd, hIMC, kret, pList->TransMsg);
1128 ret = TRUE;
1129 }
1130 else
1131 {
1132 pTransMsg = ImmLockIMCC(pIC->hMsgBuf);
1133 if (IS_NULL_UNEXPECTEDLY(pTransMsg))
1134 goto Quit;
1135 ImmPostMessages(hwnd, hIMC, kret, pTransMsg);
1136 ImmUnlockIMCC(pIC->hMsgBuf);
1137 }
1138
1139Quit:
1141 ImmUnlockImeDpi(pImeDpi);
1142 ImmUnlockIMC(hIMC);
1143 ImmReleaseContext(hwnd, hIMC);
1144 TRACE("ret: %d\n", ret);
1145 return ret;
1146#undef MSG_COUNT
1147}
1148
1149/***********************************************************************
1150 * ImmRequestMessageA(IMM32.@)
1151 */
1154 _In_ HIMC hIMC,
1157{
1158 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
1159 return ImmRequestMessageAW(hIMC, wParam, lParam, TRUE);
1160}
1161
1162/***********************************************************************
1163 * ImmRequestMessageW(IMM32.@)
1164 */
1167 _In_ HIMC hIMC,
1170{
1171 TRACE("(%p, %p, %p)\n", hIMC, wParam, lParam);
1172 return ImmRequestMessageAW(hIMC, wParam, lParam, FALSE);
1173}
1174
1175/***********************************************************************
1176 * ImmCallImeConsoleIME (IMM32.@)
1177 */
1180 _In_ HWND hWnd,
1181 _In_ UINT uMsg,
1184 _Out_ LPUINT puVK)
1185{
1186 DWORD dwThreadId, ret = 0;
1187 HKL hKL;
1188 PWND pWnd = NULL;
1189 HIMC hIMC;
1190 PIMEDPI pImeDpi;
1191 UINT uVK;
1192 PIMC pIMC;
1193
1194 switch (uMsg)
1195 {
1196 case WM_KEYDOWN:
1197 case WM_KEYUP:
1198 case WM_SYSKEYDOWN:
1199 case WM_SYSKEYUP:
1200 break;
1201
1202 default:
1203 return 0;
1204 }
1205
1208
1209 if (hWnd && gpsi)
1210 pWnd = ValidateHwndNoErr(hWnd);
1211 if (IS_NULL_UNEXPECTEDLY(pWnd))
1212 return 0;
1213
1214 hIMC = ImmGetContext(hWnd);
1215 if (IS_NULL_UNEXPECTEDLY(hIMC))
1216 return 0;
1217
1218 uVK = *puVK = (wParam & 0xFF);
1219
1221 if (IS_NULL_UNEXPECTEDLY(pIMC))
1222 return 0;
1223
1224 pImeDpi = ImmLockImeDpi(hKL);
1225 if (IS_NULL_UNEXPECTEDLY(pImeDpi))
1226 return 0;
1227
1229 goto Quit;
1230
1231 switch (uVK)
1232 {
1233 case VK_DBE_ROMAN:
1234 case VK_DBE_NOROMAN:
1235 case VK_DBE_HIRAGANA:
1236 case VK_DBE_KATAKANA:
1237 case VK_DBE_CODEINPUT:
1238 case VK_DBE_NOCODEINPUT:
1241 break;
1242
1243 default:
1244 {
1245 if (uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP)
1246 {
1247 if (uVK != VK_MENU && uVK != VK_F10)
1248 goto Quit;
1249 }
1250
1251 if (!(pImeDpi->ImeInfo.fdwProperty & IME_PROP_NEED_ALTKEY))
1252 {
1253 if (uVK == VK_MENU || (lParam & MAKELPARAM(0, KF_ALTDOWN)))
1254 goto Quit;
1255 }
1256 }
1257 }
1258
1260
1261Quit:
1262 ImmUnlockImeDpi(pImeDpi);
1263 return ret;
1264}
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define LANGID_JAPANESE
Definition: cjkcode.h:52
#define LANGID_CHINESE_SIMPLIFIED
Definition: cjkcode.h:50
#define LANGID_CHINESE_TRADITIONAL
Definition: cjkcode.h:51
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
LRESULT CtfImmSetLangBand(_In_ HWND hWnd, _In_ BOOL fSet)
Definition: ctf.c:1234
DWORD g_aimm_compat_flags
Definition: ctf.c:204
DWORD HIMCC
Definition: dimm.idl:76
DWORD HIMC
Definition: dimm.idl:75
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
#define CALLBACK
Definition: compat.h:35
BOOL NTAPI IsBadWritePtr(IN LPVOID lp, IN UINT_PTR ucb)
Definition: except.c:883
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1235
unsigned short vk
Definition: console.c:118
return ret
Definition: mutex.c:146
DWORD dwThreadId
Definition: fdebug.c:31
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
#define VK_DBE_ROMAN
Definition: ime.h:46
#define VK_DBE_HIRAGANA
Definition: ime.h:43
#define VK_DBE_CODEINPUT
Definition: ime.h:51
#define VK_DBE_NOROMAN
Definition: ime.h:47
#define VK_DBE_KATAKANA
Definition: ime.h:42
#define VK_DBE_ENTERWORDREGISTERMODE
Definition: ime.h:48
#define VK_DBE_ENTERIMECONFIGMODE
Definition: ime.h:49
#define VK_DBE_NOCODEINPUT
Definition: ime.h:52
BOOL WINAPI ImmEnumInputContext(_In_ DWORD dwThreadId, _In_ IMCENUMPROC lpfn, _In_ LPARAM lParam)
Definition: imm.c:1124
PSERVERINFO gpsi
Definition: imm.c:18
struct _tagTRANSMSG TRANSMSG
BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID)
Definition: ctf.c:781
PCLIENTIMC WINAPI ImmLockClientImc(_In_ HIMC hImc)
Definition: imm.c:955
#define IMS_SETLANGBAND
Definition: imm32_undoc.h:69
#define IMS_COMPLETECOMPSTR
Definition: imm32_undoc.h:67
struct INPUTCONTEXTDX * LPINPUTCONTEXTDX
#define IMS_UNSETLANGBAND
Definition: imm32_undoc.h:70
#define IS_IME_HKL(hKL)
Definition: imm32_undoc.h:21
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
Definition: ime.c:532
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
Definition: ime.c:562
#define IMS_SENDNOTIFICATION
Definition: imm32_undoc.h:66
#define _IME_APP_COMPAT_PROCESS_BY_IME
Definition: imm32_undoc.h:221
VOID WINAPI ImmUnlockClientImc(_Inout_ PCLIENTIMC pClientImc)
Definition: imm.c:1002
#define CLIENTIMC_WIDE
Definition: imm32_undoc.h:183
HKL FAR * LPHKL
Definition: imm.h:24
BOOL WINAPI ImmSetConversionStatus(_In_ HIMC hIMC, _In_ DWORD fdwConversion, _In_ DWORD fdwSentence)
Definition: ime.c:1535
#define IME_CMODE_NATIVE
Definition: imm.h:337
#define IME_HOTKEY_PRIVATE_LAST
Definition: imm.h:221
#define IME_JHOTKEY_CLOSE_OPEN
Definition: imm.h:200
#define IME_CMODE_SYMBOL
Definition: imm.h:352
#define IME_KHOTKEY_HANJACONVERT
Definition: imm.h:204
#define IME_CMODE_HANJACONVERT
Definition: imm.h:348
#define IME_THOTKEY_IME_NONIME_TOGGLE
Definition: imm.h:207
LONG WINAPI ImmGetCompositionStringA(_In_ HIMC hIMC, _In_ DWORD dwIndex, _Out_writes_bytes_opt_(dwBufLen) LPVOID lpBuf, _In_ DWORD dwBufLen)
Definition: compstr.c:901
#define IME_CHOTKEY_SYMBOL_TOGGLE
Definition: imm.h:197
HIMC WINAPI ImmGetContext(_In_ HWND hWnd)
Definition: imm.c:1066
#define CPS_COMPLETE
Definition: imm.h:178
#define IME_CHOTKEY_IME_NONIME_TOGGLE
Definition: imm.h:195
#define IMN_SETSENTENCEMODE
Definition: imm.h:378
#define IME_ESC_PRIVATE_HOTKEY
Definition: imm.h:423
#define IME_KHOTKEY_SHAPE_TOGGLE
Definition: imm.h:203
BOOL WINAPI ImmReleaseContext(_In_ HWND hWnd, _In_ HIMC hIMC)
Definition: imm.c:1110
BOOL WINAPI ImmGetOpenStatus(_In_ HIMC hIMC)
Definition: ime.c:997
#define GCS_COMPSTR
Definition: imm.h:227
#define IME_THOTKEY_SHAPE_TOGGLE
Definition: imm.h:208
#define IME_HOTKEY_PRIVATE_FIRST
Definition: imm.h:216
LONG WINAPI ImmGetCompositionStringW(_In_ HIMC hIMC, _In_ DWORD dwIndex, _Out_writes_bytes_opt_(dwBufLen) LPVOID lpBuf, _In_ DWORD dwBufLen)
Definition: compstr.c:949
BOOL WINAPI ImmIsIME(_In_ HKL hKL)
Definition: ime.c:430
#define IME_KHOTKEY_ENGLISH
Definition: imm.h:205
#define IMN_SETOPENSTATUS
Definition: imm.h:379
BOOL WINAPI ImmSetOpenStatus(_In_ HIMC hIMC, _In_ BOOL fOpen)
Definition: ime.c:1021
#define IME_CMODE_FULLSHAPE
Definition: imm.h:345
#define IME_THOTKEY_SYMBOL_TOGGLE
Definition: imm.h:209
#define IME_CHOTKEY_SHAPE_TOGGLE
Definition: imm.h:196
#define IMN_SETCONVERSIONMODE
Definition: imm.h:377
BOOL WINAPI ImmNotifyIME(_In_ HIMC hIMC, _In_ DWORD dwAction, _In_ DWORD dwIndex, _In_ DWORD_PTR dwValue)
Definition: ime.c:459
BOOL WINAPI ImmUnlockIMCC(_In_ HIMCC imcc)
Definition: utils.c:613
#define INPUTCONTEXTDX_CHANGE_OPEN
Definition: immdev.h:160
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
Definition: imm.c:1080
#define INPUTCONTEXTDX_CHANGE_SENTENCE
Definition: immdev.h:162
#define NI_COMPOSITIONSTR
Definition: immdev.h:363
#define IME_PROP_ACCEPT_WIDE_VKEY
Definition: immdev.h:349
#define INPUTCONTEXTDX_CHANGE_FORCE_OPEN
Definition: immdev.h:163
#define INPUTCONTEXTDX_CHANGE_CONVERSION
Definition: immdev.h:161
#define IME_PROP_NEED_ALTKEY
Definition: immdev.h:347
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
Definition: imm.c:1090
#define IME_PROP_KBD_CHAR_FIRST
Definition: immdev.h:345
#define IME_PROP_IGNORE_UPKEYS
Definition: immdev.h:346
LPVOID WINAPI ImmLockIMCC(_In_ HIMCC imcc)
Definition: utils.c:602
DWORD NTAPI NtUserNotifyIMEStatus(_In_ HWND hwnd, _In_ BOOL fOpen, _In_ DWORD dwConversion)
Definition: ime.c:850
@ THREADSTATE_OLDKEYBOARDLAYOUT
Definition: ntuser.h:2503
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:57
#define GetWin32ClientInfo()
Definition: ntuser.h:352
DWORD_PTR NTAPI NtUserGetThreadState(DWORD Routine)
Definition: misc.c:240
DWORD NTAPI NtUserGetAppImeLevel(_In_ HWND hWnd)
Definition: ime.c:973
BOOL NTAPI NtUserGetImeHotKey(_In_ DWORD dwHotKeyId, _Out_ PUINT lpuModifiers, _Out_ PUINT lpuVirtualKey, _Out_opt_ LPHKL lphKL)
Definition: ime.c:429
#define WNDS_ANSIWINDOWPROC
Definition: ntuser.h:624
#define LOBYTE(W)
Definition: jmemdos.c:487
LRESULT WINAPI ImmRequestMessageA(_In_ HIMC hIMC, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: keymsg.c:1153
static VOID ImmPostMessages(_In_ HWND hwnd, _In_ HIMC hIMC, _In_ DWORD dwCount, _In_ LPTRANSMSG lpTransMsg)
Definition: keymsg.c:952
static BOOL Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID)
Definition: keymsg.c:252
static BOOL Imm32KShapeToggle(HIMC hIMC)
Definition: keymsg.c:189
BOOL WINAPI ImmIsUIMessageA(_In_opt_ HWND hWndIME, _In_ UINT msg, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: keymsg.c:620
DWORD WINAPI ImmProcessKey(_In_ HWND hWnd, _In_ HKL hKL, _In_ UINT vKey, _In_ LPARAM lParam, _In_ DWORD dwHotKeyID)
Definition: keymsg.c:740
static BOOL Imm32JCloseOpen(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:162
DWORD WINAPI ImmGetAppCompatFlags(_In_ HIMC hIMC)
Definition: keymsg.c:722
BOOL WINAPI ImmTranslateMessage(_In_ HWND hwnd, _In_ UINT msg, _In_ WPARAM wParam, _In_ LPARAM lKeyData)
Definition: keymsg.c:1016
UINT WINAPI ImmGetVirtualKey(_In_ HWND hWnd)
Definition: keymsg.c:698
static BOOL Imm32ImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, BOOL bNowIME, LANGID LangID)
Definition: keymsg.c:18
static BOOL Imm32KHanjaConvert(HIMC hIMC)
Definition: keymsg.c:212
DWORD WINAPI ImmCallImeConsoleIME(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam, _Out_ LPUINT puVK)
Definition: keymsg.c:1179
UINT WINAPI ImmWINNLSGetIMEHotkey(_In_ HWND hwndIme)
Definition: keymsg.c:664
BOOL WINAPI ImmSimulateHotKey(_In_ HWND hWnd, _In_ DWORD dwHotKeyID)
Definition: keymsg.c:675
BOOL WINAPI ImmGenerateMessage(_In_ HIMC hIMC)
Definition: keymsg.c:875
BOOL WINAPI ImmGetHotKey(_In_ DWORD dwHotKey, _Out_ LPUINT lpuModifiers, _Out_ LPUINT lpuVKey, _Out_opt_ LPHKL lphKL)
Definition: keymsg.c:648
static BOOL Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:99
LRESULT WINAPI ImmSystemHandler(_In_ HIMC hIMC, _Inout_opt_ WPARAM wParam, _Inout_opt_ LPARAM lParam)
Definition: keymsg.c:844
BOOL Imm32SendNotification(BOOL bProcess)
Definition: keymsg.c:372
static LRESULT Imm32ProcessRequest(HIMC hIMC, PWND pWnd, DWORD dwCommand, LPVOID pData, BOOL bAnsiAPI)
Definition: keymsg.c:378
static BOOL Imm32CImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID)
Definition: keymsg.c:68
static LRESULT ImmRequestMessageAW(_In_ HIMC hIMC, _In_ WPARAM wParam, _In_ LPARAM lParam, _In_ BOOL bAnsi)
Definition: keymsg.c:587
static BOOL Imm32CSymbolToggle(HIMC hIMC, HKL hKL, HWND hWnd)
Definition: keymsg.c:130
BOOL WINAPI ImmIsUIMessageW(_In_opt_ HWND hWndIME, _In_ UINT msg, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: keymsg.c:634
LRESULT WINAPI ImmRequestMessageW(_In_ HIMC hIMC, _In_ WPARAM wParam, _In_ LPARAM lParam)
Definition: keymsg.c:1166
static BOOL CALLBACK Imm32SendNotificationProc(_In_ HIMC hIMC, _In_ LPARAM lParam)
Definition: keymsg.c:339
#define MSG_COUNT
static BOOL Imm32KEnglish(HIMC hIMC)
Definition: keymsg.c:230
static BOOL ImmIsUIMessageAW(_In_opt_ HWND hWndIME, _In_ UINT msg, _In_ WPARAM wParam, _In_ LPARAM lParam, _In_ BOOL bAnsi)
Definition: keymsg.c:310
USHORT LANGID
Definition: mui.h:9
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
UINT_PTR HKL
Definition: msctf.idl:125
EXTERN_C HRESULT WINAPI CtfImeProcessCicHotkey(_In_ HIMC hIMC, _In_ UINT vKey, _In_ LPARAM lParam)
Definition: msctfime.cpp:795
unsigned int UINT
Definition: ndis.h:50
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define BOOL
Definition: nt_native.h:43
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
#define offsetof(TYPE, MEMBER)
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define LANG_JAPANESE
Definition: nls.h:76
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define LANG_KOREAN
Definition: nls.h:84
#define _WIN32_WINNT_NT4
Definition: sdkddkver.h:20
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
IMEINFO ImeInfo
Definition: imm32_undoc.h:108
Definition: ntuser.h:694
THRDESKHEAD head
Definition: ntuser.h:695
DWORD state
Definition: ntuser.h:701
DWORD fdwProperty
Definition: immdev.h:22
HIMCC hMsgBuf
Definition: immdev.h:124
DWORD fdwConversion
Definition: immdev.h:111
DWORD fdwSentence
Definition: immdev.h:112
DWORD dwNumMsgBuf
Definition: immdev.h:123
DWORD dwCompatFlags
Definition: imm32_undoc.h:164
Definition: ntuser.h:199
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
#define MAKEWORD(a, b)
Definition: typedefs.h:248
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t * LPUINT
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define IPHK_SKIPTHISKEY
Definition: undocuser.h:143
#define IPHK_HOTKEY
Definition: undocuser.h:140
#define IPHK_PROCESSBYIME
Definition: undocuser.h:141
_Must_inspect_result_ _In_ WDFUSBDEVICE _In_opt_ WDFREQUEST _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_writes_opt_ NumCharacters PUSHORT _Inout_ PUSHORT _In_ UCHAR _In_opt_ USHORT LangID
Definition: wdfusb.h:1083
#define IS_ZERO_UNEXPECTEDLY(p)
Definition: precomp.h:68
LONG IchAnsiFromWide(LONG cchWide, LPCWSTR pchWide, UINT uCodePage)
Definition: utils.c:140
LPVOID FASTCALL ValidateHandleNoErr(HANDLE hObject, UINT uType)
Definition: utils.c:201
#define ValidateHwnd(hwnd)
Definition: precomp.h:98
DWORD Imm32ReconvertWideFromAnsi(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:450
#define ImmLocalFree(lpData)
Definition: precomp.h:102
#define IS_CROSS_THREAD_HIMC(hIMC)
Definition: precomp.h:73
PTHREADINFO FASTCALL Imm32CurrentPti(VOID)
Definition: utils.c:18
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:97
LONG IchWideFromAnsi(LONG cchAnsi, LPCSTR pchAnsi, UINT uCodePage)
Definition: utils.c:120
VOID LogFontAnsiToWide(const LOGFONTA *plfA, LPLOGFONTW plfW)
Definition: utils.c:164
#define INVALID_HOTKEY_ID
Definition: precomp.h:78
#define IS_NULL_UNEXPECTEDLY(p)
Definition: precomp.h:67
DWORD WINNLSTranslateMessage(_In_ INT cEntries, _Inout_ PTRANSMSG pEntries, _In_ HIMC hIMC, _In_ BOOL bAnsi, _In_ WORD wLang)
Definition: win3.c:1723
DWORD Imm32ReconvertAnsiFromWide(LPRECONVERTSTRING pDest, const RECONVERTSTRING *pSrc, UINT uCodePage)
Definition: utils.c:512
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
Definition: utils.c:275
VOID LogFontWideToAnsi(const LOGFONTW *plfW, LPLOGFONTA plfA)
Definition: utils.c:176
#define ImeDpi_IsUnicode(pImeDpi)
Definition: precomp.h:117
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WINAPI
Definition: msvc.h:6
BOOL WINAPI IsWindow(_In_opt_ HWND)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
#define WM_IME_REQUEST
Definition: winuser.h:1864
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define WM_KEYUP
Definition: winuser.h:1744
#define WM_IME_NOTIFY
Definition: winuser.h:1858
#define VK_F10
Definition: winuser.h:2300
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define KF_ALTDOWN
Definition: winuser.h:2485
#define VK_PROCESSKEY
Definition: winuser.h:2363
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
int WINAPI ToUnicode(_In_ UINT wVirtKey, _In_ UINT wScanCode, _In_reads_bytes_opt_(256) CONST BYTE *lpKeyState, _Out_writes_(cchBuff) LPWSTR pwszBuff, _In_ int cchBuff, _In_ UINT wFlags)
_Check_return_ BOOL WINAPI GetKeyboardState(_Out_writes_(256) PBYTE lpKeyState)
#define WM_IME_SETCONTEXT
Definition: winuser.h:1857
#define KF_UP
Definition: winuser.h:2487
UINT WINAPI GetKeyboardLayoutList(_In_ int nBuff, _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList)
#define VK_KANJI
Definition: winuser.h:2249
#define WM_SYSKEYUP
Definition: winuser.h:1748
#define WM_IME_COMPOSITIONFULL
Definition: winuser.h:1860
#define WM_IME_SELECT
Definition: winuser.h:1861
#define WM_KEYDOWN
Definition: winuser.h:1743
int WINAPI ToAsciiEx(_In_ UINT, _In_ UINT, _In_reads_opt_(256) CONST BYTE *, _Out_ LPWORD, _In_ UINT, _In_opt_ HKL)
BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_SYSKEYDOWN
Definition: winuser.h:1747
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define VK_MENU
Definition: winuser.h:2240
unsigned char BYTE
Definition: xxhash.c:193