485{
487
488 if (!hIMC)
489 {
491 return 0;
492 }
493
494
497 {
498 ERR(
"!dwProcessId\n");
499 return 0;
500 }
501
503 {
504 if (bTargetIsAnsi)
505 {
506 ERR(
"ImmGetImeMenuItemsA cannot cross process boundary\n");
507 return 0;
508 }
509
510
513 }
514
516 if (!pIC)
517 {
519 return 0;
520 }
521
522
525 {
526 ERR(
"!dwThreadId\n");
528 return 0;
529 }
530
531
534 if (!pImeDpi)
535 {
538 return 0;
539 }
540
541
542 if (!pImeDpi->ImeGetImeMenuItems)
543 {
544 WARN(
"ImeGetImeMenuItems is not available (optional).\n");
547 return 0;
548 }
549
550
552
556
557
558 if (bImcIsAnsi != bTargetIsAnsi)
559 {
561 if (bTargetIsAnsi)
562 {
563
564 if (lpImeParentMenu)
565 {
567 pNewParent = &ParentW;
568 }
569
570
571 if (lpImeMenuItems)
572 {
575 if (!pNewItems)
576 {
578 goto Quit;
579 }
580 }
581 }
582 else
583 {
584
585 if (lpImeParentMenu)
586 {
588 pNewParent = &ParentA;
589 }
590
591
592 if (lpImeMenuItems)
593 {
596 if (!pNewItems)
597 {
599 goto Quit;
600 }
601 }
602 }
603 }
604 else
605 {
606
607 pNewItems = lpImeMenuItems;
608 pNewParent = lpImeParentMenu;
609 }
610
611
612 ret = pImeDpi->ImeGetImeMenuItems(hIMC,
dwFlags, dwType, pNewParent, pNewItems,
dwSize);
614 {
615 ERR(
"ImeGetImeMenuItems failed\n");
616 goto Quit;
617 }
618
619 if (!lpImeMenuItems)
620 goto Quit;
621
622 if (bImcIsAnsi != bTargetIsAnsi)
623 {
624 if (bTargetIsAnsi)
625 {
626
627 if (pNewParent)
629
630
631 pItemW = pNewItems;
632 pItemA = lpImeMenuItems;
633 for (iItem = 0; iItem <
ret; ++iItem, ++pItemW, ++pItemA)
634 {
636 }
637 }
638 else
639 {
640
641 if (pNewParent)
643
644
645 pItemA = pNewItems;
646 pItemW = lpImeMenuItems;
647 for (iItem = 0; iItem <
dwSize; ++iItem, ++pItemA, ++pItemW)
648 {
650 }
651 }
652 }
653
654Quit:
655 if (pNewItems != lpImeMenuItems)
660}
PIMEDPI WINAPI ImmLockImeDpi(_In_ HKL hKL)
VOID WINAPI ImmUnlockImeDpi(_Inout_opt_ PIMEDPI pImeDpi)
LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC)
BOOL WINAPI ImmUnlockIMC(_In_ HIMC hIMC)
#define ImmLocalFree(lpData)
BOOL Imm32IsImcAnsi(HIMC hIMC)
LPVOID ImmLocalAlloc(_In_ DWORD dwFlags, _In_ DWORD dwBytes)
DWORD WINAPI GetCurrentProcessId(void)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)