128 fprintf(
stdout,
"%s:%d: msg_spy: message buffer overflow!\n",
163 if (
msg_spy.call_wnd_proc_hook)
172 static const char wndcls[] =
"winetest_imm32_wndcls";
181 HWND default_ime_wnd;
191 ok(!default_ime_wnd,
"expected no IME windows\n");
194 ok(default_ime_wnd !=
NULL,
"expected IME window existence\n");
208 ok(default_ime_wnd !=
NULL,
"expected IME window existence\n");
211 ok(!default_ime_wnd,
"expected no IME windows\n");
223 ok(default_ime_wnd !=
NULL,
"expected IME window existence\n");
226 ok(!default_ime_wnd,
"expected no IME windows\n");
275 win_skip(
"IME support not implemented\n");
296 static const char string[] =
"wine";
297 char resstr[16] =
"";
307 "Canceling an empty composition string should succeed.\n");
309 "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " 310 "the composition string being canceled is empty.\n");
320 ok(!
ret,
"After being cancelled the composition string is empty.\n");
327 "Canceling an empty composition string should succeed.\n");
329 "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " 330 "the composition string being canceled is empty.\n");
340 ok (
ret == 0,
"Bad IME should return 0\n");
345 ok (
ret == 0,
"NULL IME should return 0\n");
350 ok (
ret == 0,
"Destroyed IME should return 0\n");
368 case WM_IME_COMPOSITION:
377 ok(hwndIme !=
NULL,
"expected IME window existence\n");
390 wstring,
sizeof(wstring));
391 ok(
size > 0,
"ImmGetCompositionString(GCS_RESULTSTR) is %d\n",
size);
425 static const WCHAR string[] = {
'w',
'i',
'n',
'e',0x65e5,0x672c,0x8a9e};
436 win_skip(
"Composition isn't supported\n");
448 ok(
len*
sizeof(
WCHAR)==wlen,
"GCS_COMPATTR(W) not returning correct count\n");
450 ok(
len==alen,
"GCS_COMPATTR(A) not returning correct count\n");
453 memset(wstring, 0x1a,
sizeof(wstring));
454 memset(cstring, 0x1a,
sizeof(cstring));
457 ok(
len == alen,
"Unexpected length %d.\n",
len);
458 ok(cstring[alen] == 0x1a,
"Unexpected buffer contents.\n");
461 ok(
len == wlen,
"Unexpected length %d.\n",
len);
462 ok(wstring[wlen/
sizeof(
WCHAR)] == 0x1a1a,
"Unexpected buffer contents.\n");
465 memset(wstring, 0x1a,
sizeof(wstring));
466 memset(cstring, 0x1a,
sizeof(cstring));
470 ok(!
len,
"Unexpected length %d.\n",
len);
471 ok(cstring[0] ==
'w',
"Unexpected buffer contents %s.\n", cstring);
474 ok(
len == wlen - 1,
"Unexpected length %d.\n",
len);
475 ok(!
memcmp(wstring,
string, wlen - 1),
"Unexpected buffer contents.\n");
478 memset(wstring, 0x1a,
sizeof(wstring));
479 memset(cstring, 0x1a,
sizeof(cstring));
482 ok(
len == alen,
"Unexpected length %d.\n",
len);
483 ok(cstring[0] == 0x1a,
"Unexpected buffer contents %s.\n", cstring);
486 ok(
len == wlen,
"Unexpected length %d.\n",
len);
487 ok(wstring[0] == 0x1a1a,
"Unexpected buffer contents.\n");
490 win_skip(
"Composition string isn't available\n");
498 skip(
"This IME doesn't support SCS_SETSTR\n");
508 string,
sizeof(
string),
NULL,0);
509 ok(
ret,
"ImmSetCompositionStringW failed\n");
511 wstring,
sizeof(wstring));
514 ok(
ret,
"ImmNotifyIME(CPS_COMPLETE) failed\n");
517 "WM_IME_COMPOSITION(GCS_RESULTSTR) isn't sent\n");
520 win_skip(
"Composition string isn't available\n");
532 const DWORD MY_TIMER = 0xcaffe;
535 "IME composition test",
540 "Input a DBCS character here using IME.",
561 skip(
"WM_IME_COMPOSITION(GCS_RESULTSTR) isn't tested\n");
573 ok(imc != 0,
"ImmGetContext() failed. Last error: %u\n",
GetLastError());
580 "ImmSetCompositionStringW() failed.\n");
584 ok(!
ret,
"ImmSetCompositionStringW() succeeded.\n");
588 ok(!
ret,
"ImmSetCompositionStringW() succeeded.\n");
592 ok(!
ret,
"ImmSetCompositionStringW() succeeded.\n");
596 ok(!
ret,
"ImmSetCompositionStringW() succeeded.\n");
610 ok (rc == 0,
"ImmConfigureIMEA did not fail\n");
612 ok (rc == 0,
"ImmConfigureIMEW did not fail\n");
622 if (!pImmAssociateContextEx)
return;
630 ok(newimc != imc,
"handles should not be the same\n");
631 rc = pImmAssociateContextEx(
NULL,
NULL, 0);
632 ok(!rc,
"ImmAssociateContextEx succeeded\n");
633 rc = pImmAssociateContextEx(
hwnd,
NULL, 0);
634 ok(rc,
"ImmAssociateContextEx failed\n");
635 rc = pImmAssociateContextEx(
NULL, imc, 0);
636 ok(!rc,
"ImmAssociateContextEx succeeded\n");
638 rc = pImmAssociateContextEx(
hwnd, imc, 0);
639 ok(rc,
"ImmAssociateContextEx failed\n");
641 ok(retimc == imc,
"handles should be the same\n");
644 rc = pImmAssociateContextEx(
hwnd, newimc, 0);
645 ok(rc,
"ImmAssociateContextEx failed\n");
647 ok(retimc == newimc,
"handles should be the same\n");
651 ok(rc,
"ImmAssociateContextEx failed\n");
679 ok(
info->himc == h1,
"hwnd context changed in new thread\n");
681 ok(h2 != h1,
"new hwnd in new thread should have different context\n");
690 ok(h1 == h2,
"Windows in same thread should have same default context\n");
718 HIMC himc, otherHimc, h1;
731 threadinfo.
himc = himc;
737 ok(himc != otherHimc,
"Windows from other threads should have different himc\n");
738 ok(otherHimc == threadinfo.
himc,
"Context from other thread should not change in main thread\n");
741 ok(h1 ==
NULL,
"Should fail to be able to Associate a default context from a different thread\n");
743 ok(h1 == himc,
"Context for window should remain unchanged\n");
747 ok (h1 ==
NULL,
"Should fail to associate a context from a different thread\n");
749 ok(h1 == himc,
"Context for window should remain unchanged\n");
753 ok (h1 ==
NULL,
"Should fail to associate a context from a different thread into a window from that thread.\n");
755 ok(h1 == threadinfo.
himc,
"Context for window should remain unchanged\n");
760 ok(rc != 0,
"ImmSetOpenStatus failed\n");
762 ok(rc != 0,
"ImmGetOpenStatus failed\n");
764 ok(rc != 0,
"ImmSetOpenStatus failed\n");
766 ok(rc == 0,
"ImmGetOpenStatus failed\n");
769 ok(rc == 0,
"ImmSetOpenStatus should fail\n");
771 ok(rc == 0,
"ImmSetOpenStatus should fail\n");
773 ok(rc == 0,
"ImmGetOpenStatus failed\n");
775 ok (rc == 1 ||
broken(rc == 0),
"ImmGetOpenStatus should return 1\n");
777 ok(rc == 0,
"ImmSetOpenStatus should fail\n");
779 ok(rc == 0,
"ImmGetOpenStatus failed\n");
783 ok(rc != 0,
"ImmGetCompositionFont failed\n");
785 ok(rc != 0,
"ImmSetCompositionFont failed\n");
788 ok(rc != 0 ||
broken(rc == 0),
"ImmGetCompositionFont failed\n");
790 ok(rc != 0 ||
broken(rc == 0),
"ImmGetCompositionFont user himc failed\n");
792 ok(rc == 0,
"ImmSetCompositionFont should fail\n");
794 ok(rc == 0,
"ImmSetCompositionFont should fail\n");
798 ok(rc != 0,
"ImmSetCompositionWindow failed\n");
800 ok(rc != 0,
"ImmGetCompositionWindow failed\n");
803 ok(rc == 0,
"ImmSetCompositionWindow should fail\n");
805 ok(rc == 0,
"ImmSetCompositionWindow should fail\n");
807 ok(rc != 0 ||
broken(rc == 0),
"ImmGetCompositionWindow failed\n");
809 ok(rc != 0 ||
broken(rc == 0),
"ImmGetCompositionWindow failed\n");
813 ok(rc != 0,
"ImmGetConversionStatus failed\n");
815 ok(rc != 0,
"ImmSetConversionStatus failed\n");
818 ok(rc != 0 ||
broken(rc == 0),
"ImmGetConversionStatus failed\n");
820 ok(rc != 0 ||
broken(rc == 0),
"ImmGetConversionStatus failed\n");
822 ok(rc == 0,
"ImmSetConversionStatus should fail\n");
824 ok(rc == 0,
"ImmSetConversionStatus should fail\n");
828 ok(rc != 0,
"ImmSetStatusWindowPos failed\n");
830 ok(rc != 0,
"ImmGetStatusWindowPos failed\n");
833 ok(rc == 0,
"ImmSetStatusWindowPos should fail\n");
835 ok(rc == 0,
"ImmSetStatusWindowPos should fail\n");
837 ok(rc != 0 ||
broken(rc == 0),
"ImmGetStatusWindowPos failed\n");
839 ok(rc != 0 ||
broken(rc == 0),
"ImmGetStatusWindowPos failed\n");
842 ok (h1 == otherHimc,
"ImmAssociateContext cross thread with NULL should work\n");
844 ok (h1 ==
NULL,
"CrossThread window context should be NULL\n");
846 ok (h1 ==
NULL,
"Resetting cross thread context should fail\n");
848 ok (h1 ==
NULL,
"CrossThread window context should still be NULL\n");
851 ok (rc == 0,
"ImmDestroyContext Cross Thread should fail\n");
855 ok (rc == 0,
"ImmGetCandidateWindow should fail\n");
861 ok (rc == 1,
"ImmSetCandidateWindow should succeed\n");
863 ok (rc == 1,
"ImmGetCandidateWindow should succeed\n");
866 ok (rc == 0,
"ImmGetCandidateWindow should fail\n");
868 ok (rc == 0,
"ImmSetCandidateWindow should fail\n");
870 ok (rc == 1 ||
broken( rc == 0),
"ImmGetCandidateWindow should succeed\n");
872 ok (rc == 0,
"ImmSetCandidateWindow should fail\n");
879 ok(rc == 1,
"PostThreadMessage should succeed\n");
884 ok(himc ==
NULL,
"Should not be able to get himc from other process window\n");
898 { WM_IME_STARTCOMPOSITION,
TRUE },
899 { WM_IME_ENDCOMPOSITION,
TRUE },
900 { WM_IME_COMPOSITION,
TRUE },
925 if (!pImmIsUIMessageA)
return;
931 ok(
ret ==
test->ret,
"ImmIsUIMessageA returned %x for %x\n",
ret,
test->msg);
935 ok(
ret ==
test->ret,
"ImmIsUIMessageA returned %x for %x\n",
ret,
test->msg);
942 ret = pImmIsUIMessageA(
NULL, WM_MSIME_SERVICE, 0, 0);
943 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_SERVICE\n");
944 ret = pImmIsUIMessageA(
NULL, WM_MSIME_RECONVERTOPTIONS, 0, 0);
945 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_RECONVERTOPTIONS\n");
946 ret = pImmIsUIMessageA(
NULL, WM_MSIME_MOUSE, 0, 0);
947 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_MOUSE\n");
948 ret = pImmIsUIMessageA(
NULL, WM_MSIME_RECONVERTREQUEST, 0, 0);
949 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_RECONVERTREQUEST\n");
950 ret = pImmIsUIMessageA(
NULL, WM_MSIME_RECONVERT, 0, 0);
951 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_RECONVERT\n");
952 ret = pImmIsUIMessageA(
NULL, WM_MSIME_QUERYPOSITION, 0, 0);
953 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_QUERYPOSITION\n");
954 ret = pImmIsUIMessageA(
NULL, WM_MSIME_DOCUMENTFEED, 0, 0);
955 ok(!
ret,
"ImmIsUIMessageA returned TRUE for WM_MSIME_DOCUMENTFEED\n");
966 ok(himc ==
NULL,
"ImmGetContext succeeded\n");
970 ok(himc !=
NULL,
"ImmGetContext failed\n");
983 ok(!
ret,
"ImmGetDescriptionW failed, expected 0 received %d.\n",
ret);
985 ok(!
ret,
"ImmGetDescriptionA failed, expected 0 received %d.\n",
ret);
989 ok(
hkl != 0,
"GetKeyboardLayout failed, expected != 0.\n");
994 win_skip(
"ImmGetDescriptionW is not working for current loaded keyboard.\n");
1000 ok (
ret == 0,
"ImmGetDescriptionW with 0 hkl should return 0\n");
1002 ok (
ret == 0xdeadcafe,
"Last Error should remain unchanged\n");
1005 ok(
ret,
"ImmGetDescriptionW failed, expected != 0 received 0.\n");
1008 ok(lret,
"ImmGetDescriptionW failed, expected != 0 received 0.\n");
1009 ok(lret ==
ret,
"ImmGetDescriptionW failed to return the correct amount of data. Expected %d, got %d.\n",
ret, lret);
1012 ok(lret,
"ImmGetDescriptionA failed, expected != 0 received 0.\n");
1013 ok(lret ==
ret,
"ImmGetDescriptionA failed to return the correct amount of data. Expected %d, got %d.\n",
ret, lret);
1017 ok(lret,
"ImmGetDescriptionW failed, expected != 0 received 0.\n");
1018 ok(lret ==
ret,
"ImmGetDescriptionW failed to return the correct amount of data. Expected %d, got %d.\n",
ret, lret);
1021 ok(!lret,
"ImmGetDescriptionA should fail\n");
1024 ok(!
ret,
"ImmGetDescriptionW failed, expected 0 received %d.\n",
ret);
1039 CreateWindowA(
"static",
"static",
WS_POPUP, 0, 0, 1, 1,
NULL,
NULL,
NULL,
NULL);
1049 HIMC imc1, imc2, imc3;
1065 win_skip(
"IME support not implemented\n");
1084 ok(def3 == def1,
"Default IME window should not change\n");
1085 ok(imc1 == imc3,
"IME context should not change\n");
1102 static const WCHAR imeW[] = {
'I',
'M',
'E',0};
1103 WCHAR class_nameW[16];
1129 HWND hwnd1, hwnd2, default_ime_wnd, ime_wnd;
1146 ok(ime_wnd !=
NULL,
"Expected IME window existence\n");
1148 ok(ime_wnd == default_ime_wnd,
"Expected %p, got %p\n", ime_wnd, default_ime_wnd);
1159 "Expected IME window existence\n");
1161 ok(!
IsWindow(ime_wnd),
"Expected no IME windows\n");
1169 HWND hwnd1, hwnd2, default_ime_wnd, ime_wnd;
1177 ok(hwnd1 ==
NULL,
"creation succeeded, got %p\n", hwnd1);
1185 ok(hwnd1 ==
NULL,
"creation succeeded, got %p\n", hwnd1);
1194 ok(ime_wnd !=
NULL,
"Expected IME window existence\n");
1196 ok(ime_wnd == default_ime_wnd,
"Expected %p, got %p\n", ime_wnd, default_ime_wnd);
1199 ok(!
IsWindow(ime_wnd),
"Expected no IME windows\n");
1215 ok(!default_ime_wnd,
"Expected no IME windows\n");
1222 HWND hwnd1, hwnd2, default_ime_wnd;
1230 ok(!
IsWindow(default_ime_wnd),
"Expected no IME windows, got %p\n", default_ime_wnd);
1237 ok(
IsWindow(default_ime_wnd),
"Expected IME window existence\n");
1247 ok(
IsWindow(default_ime_wnd),
"Expected IME window existence\n");
1250 ok(
IsWindow(default_ime_wnd),
"Expected IME window existence\n");
1312 ok(
count == 0,
"Invalid IMC should return 0\n");
1317 ok(
count == 0,
"NULL IMC should return 0\n");
1319 ok(
ret == 0xdeadbeef,
"Last Error should remain unchanged: %08x\n",
ret);
1321 ok(
count == 0,
"Destroyed IMC should return 0\n");
1329 ok(ic !=
NULL,
"ImmLockIMC failed!\n");
1344 ok(ic !=
NULL,
"ImmLockIMC failed!\n");
1390 ok(
count == g_count,
"count %d, g_count %d\n",
count, g_count);
1416 ok(ic !=
NULL,
"ImmLockIMC failed!\n");
1420 ok(
ret ==
TRUE,
"Destroy a locked IMC should success!\n");
1422 ok(ic ==
NULL,
"Lock a destroyed IMC should fail!\n");
1424 ok(
ret ==
FALSE,
"Unlock a destroyed IMC should fail!\n");
1426 ok(
count == 0,
"Get lock count of a destroyed IMC should return 0!\n");
1429 ok(
ret ==
FALSE,
"Destroy a destroyed IMC should fail!\n");
1444 ok(
p !=
NULL,
"ImmLockIMCC failed!\n");
1450 ok(
p ==
NULL,
"Destroy a locked IMCC should success!\n");
1452 ok(
p ==
NULL,
"Lock a destroyed IMCC should fail!\n");
1454 ok(
ret ==
FALSE,
"Unlock a destroyed IMCC should return FALSE!\n");
1456 ok(
count == 0,
"Get lock count of a destroyed IMCC should return 0!\n");
1458 ok(
size == 0,
"Get size of a destroyed IMCC should return 0!\n");
1461 ok(
p !=
NULL,
"returned NULL\n");
1491 if (
msg)
ok(!
msg->post,
"Message should not be posted\n");
1499 lpTransMsg->
message = WM_IME_STARTCOMPOSITION;
1510 if (
msg)
ok(!
msg->post,
"Message should not be posted\n");
1518 lpTransMsg->
message = WM_IME_COMPOSITION;
1529 if (
msg)
ok(!
msg->post,
"Message should not be posted\n");
1537 lpTransMsg->
message = WM_IME_ENDCOMPOSITION;
1548 if (
msg)
ok(!
msg->post,
"Message should not be posted\n");
1565 WCHAR classNameW[] = {
'P',
'r',
'o',
'c',
'e',
's',
's',
'K',
'e',
'y',
'T',
'e',
's',
't',
'C',
'l',
'a',
's',
's',0};
1566 WCHAR windowNameW[] = {
'P',
'r',
'o',
'c',
'e',
's',
's',
'K',
'e',
'y',0};
1587 win_skip(
"Failed to register window.\n");
1629 inputs[0].
u.
ki.
wVk = 0x41;
1633 pSendInput(1, (
INPUT*)inputs,
sizeof(
INPUT));
1643 trace(
"ProcessKey was correctly found\n");
1649 inputs[0].u.
ki.
wVk = 0x41;
1653 pSendInput(1, (
INPUT*)inputs,
sizeof(
INPUT));
1676 HIMC imc_null = 0x00000000;
1679 HIMC imc1, imc2, oldimc;
1686 memset(&lf, 0,
sizeof(lf));
1690 ok(
ret ==
TRUE,
"Destroy an IMC should success!\n");
1696 ok(!oldimc,
"Associating to a destroyed imc should fail!\n");
1700 ok(imc1 == imc2,
"imc should not changed! imc1 %p, imc2 %p\n", imc1, imc2);
1704 ok(oldimc !=
NULL,
"Associating to NULL imc should success!\n");
1706 ok(!imc2,
"expect NULL, returned %p\n", imc2);
1708 ok(!oldimc,
"expect NULL, returned %p\n", oldimc);
1710 ok(imc2 == imc1,
"imc should not changed! imc2 %p, imc1 %p\n", imc2, imc1);
1716 ok(!oldimc,
"Associating to a destroyed imc should fail!\n");
1720 ok(imc1 == imc2,
"imc should not changed! imc1 %p, imc2 %p\n", imc1, imc2);
1726 ok(
ret == 0,
"Bad IME should return 0\n");
1731 ok(
ret == 0,
"NULL IME should return 0\n");
1733 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1736 ok(
ret == 0,
"Destroyed IME should return 0\n");
1743 ok(
ret == 0,
"Bad IME should return 0\n");
1748 ok(
ret == 0,
"NULL IME should return 0\n");
1750 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1753 ok(
ret == 0,
"Destroyed IME should return 0\n");
1760 ok(
ret == 0,
"Bad IME should return 0\n");
1765 ok(
ret == 0,
"NULL IME should return 0\n");
1767 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1770 ok(
ret == 0,
"Destroyed IME should return 0\n");
1777 ok(
ret == 0,
"Bad IME should return 0\n");
1782 ok(
ret == 0,
"NULL IME should return 0\n");
1784 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1787 ok(
ret == 0,
"Destroyed IME should return 0\n");
1794 ok(
ret == 0,
"Bad IME should return 0\n");
1799 ok(
ret == 0,
"NULL IME should return 0\n");
1801 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1804 ok(
ret == 0,
"Destroyed IME should return 0\n");
1811 ok(
ret == 0,
"Bad IME should return 0\n");
1816 ok(
ret == 0,
"NULL IME should return 0\n");
1818 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1821 ok(
ret == 0,
"Destroyed IME should return 0\n");
1828 ok(
ret == 0,
"Bad IME should return 0\n");
1833 ok(
ret == 0,
"NULL IME should return 0\n");
1838 ok(
ret == 0,
"Destroyed IME should return 0\n");
1845 ok(
ret == 0,
"Bad IME should return 0\n");
1850 ok(
ret == 0,
"NULL IME should return 0\n");
1852 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1855 ok(
ret == 0,
"Destroyed IME should return 0\n");
1862 ok(
ret == 0,
"Bad IME should return 0\n");
1867 ok(
ret == 0,
"NULL IME should return 0\n");
1869 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1872 ok(
ret == 0,
"Destroyed IME should return 0\n");
1879 ok(
ret == 0,
"Bad IME should return 0\n");
1884 ok(
ret == 0,
"NULL IME should return 0\n");
1889 ok(
ret == 0,
"Destroyed IME should return 0\n");
1896 ok(
ret == 0,
"Bad IME should return 0\n");
1901 ok(
ret == 0,
"NULL IME should return 0\n");
1906 ok(
ret == 0,
"Destroyed IME should return 0\n");
1913 ok(
ret == 0,
"Bad IME should return 0\n");
1918 ok(
ret == 0,
"NULL IME should return 0\n");
1923 ok(
ret == 0,
"Destroyed IME should return 0\n");
1930 ok(
ret == 0,
"Bad IME should return 0\n");
1935 ok(
ret == 0,
"NULL IME should return 0\n");
1940 ok(
ret == 0,
"Destroyed IME should return 0\n");
1947 ok(
ret == 0,
"Bad IME should return 0\n");
1952 ok(
ret == 0,
"NULL IME should return 0\n");
1957 ok(
ret == 0,
"Destroyed IME should return 0\n");
1964 ok(
ret == 0,
"Bad IME should return 0\n");
1969 ok(
ret == 0,
"NULL IME should return 0\n");
1974 ok(
ret == 0,
"Destroyed IME should return 0\n");
1981 ok(ic == 0,
"Bad IME should return 0\n");
1986 ok(ic == 0,
"NULL IME should return 0\n");
1988 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
1991 ok(ic == 0,
"Destroyed IME should return 0\n");
1998 ok(
ret == 0,
"Bad IME should return 0\n");
2003 ok(
ret == 0,
"NULL IME should return 0\n");
2005 ok(
ret == 0xdeadbeef,
"last error should remain unchanged %08x!\n",
ret);
2008 ok(
ret == 0,
"Destroyed IME should return 0\n");
2015 ok(
ret == 0,
"Bad IME should return 0\n");
2020 ok(
ret == 0,
"NULL IME should return 0\n");
2025 ok(
ret == 0,
"Destroyed IME should return 0\n");
2056 else win_skip(
"SendInput is not available\n");
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
DWORD WINAPI ImmGetCandidateListCountA(HIMC hIMC, LPDWORD lpdwListCount)
static void test_ImmSetCompositionString(void)
#define IMC_GETCANDIDATEPOS
struct _WNDCLASSEXA WNDCLASSEXA
static void test_ImmGetIMCLockCount(void)
static void msg_spy_init(HWND hwnd)
static void test_ImmAssociateContextEx(void)
BOOL WINAPI TranslateMessage(_In_ const MSG *)
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
BOOL WINAPI ImmConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
int WINAPI GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
static LRESULT WINAPI imm_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
BOOL WINAPI IsWindow(_In_opt_ HWND)
static DWORD WINAPI ImmGetContextThreadFunc(LPVOID lpParam)
static LRESULT WINAPI wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LPINPUTCONTEXT WINAPI ImmLockIMC(HIMC hIMC)
static struct test_info tests[]
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
GLuint GLuint GLsizei count
UINT NTAPI GlobalFlags(HGLOBAL hMem)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define ERROR_INVALID_HANDLE
BOOL WINAPI UpdateWindow(_In_ HWND)
DWORD WINAPI GetTickCount(VOID)
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
HIMCC WINAPI ImmDestroyIMCC(HIMCC block)
BOOL WINAPI EnumThreadWindows(_In_ DWORD, _In_ WNDENUMPROC, _In_ LPARAM)
BOOL WINAPI PostThreadMessageA(_In_ DWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static void msg_spy_pump_msg_queue(void)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(VOID)
DWORD WINAPI ImmGetIMCCSize(HIMCC imcc)
HWND WINAPI SetFocus(_In_opt_ HWND)
static BOOL CALLBACK is_ime_window_proc(HWND hWnd, LPARAM param)
HGLOBAL NTAPI GlobalHandle(LPCVOID pMem)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
static void test_ImmIME(void)
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
BOOL WINAPI ImmGetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
static DWORD WINAPI test_default_ime_disabled_cb(void *arg)
BOOL WINAPI DestroyWindow(_In_ HWND)
static void test_ImmGetIMCCLockCount(void)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
#define WM_IME_COMPOSITIONFULL
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE, _In_ LPCSTR)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LONG WINAPI ImmGetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
BOOL WINAPI ImmSetStatusWindowPos(HIMC hIMC, LPPOINT lpptPos)
BOOL WINAPI ImmDestroyContext(HIMC hIMC)
static void msg_spy_cleanup(void)
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
BOOL WINAPI ImmSetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
BOOL WINAPI ImmGetConversionStatus(HIMC hIMC, LPDWORD lpfdwConversion, LPDWORD lpfdwSentence)
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd)
LPVOID WINAPI ImmLockIMCC(HIMCC imcc)
LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
DWORD WINAPI ImmGetIMCLockCount(HIMC hIMC)
static void msg_spy_flush_msgs(void)
static void test_default_ime_window_creation(void)
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
static UINT WPARAM LPARAM lparam
UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
static void test_ImmThreads(void)
static DWORD WINAPI test_default_ime_window_cancel_cb(void *arg)
static const char wndcls[]
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
static imm_msgs * msg_spy_find_msg(UINT message)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
static const WCHAR imeW[]
HWND WINAPI GetDesktopWindow(void)
struct _tagTRANSMSG * LPTRANSMSG
static HWND thread_ime_wnd
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
static void test_InvalidIMC(void)
HIMC WINAPI ImmCreateContext(void)
DWORD WINAPI GetCurrentThreadId(VOID)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
BOOL WINAPI ImmGetOpenStatus(HIMC hIMC)
LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK processkey_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
#define ERROR_INVALID_WINDOW_HANDLE
struct _igc_threadinfo igc_threadinfo
static void test_ImmDestroyIMCC(void)
BOOL WINAPI UnloadKeyboardLayout(_In_ HKL)
static enum @1644 test_phase
BOOL WINAPI SetWindowTextA(_In_ HWND, _In_opt_ LPCSTR)
LONG WINAPI ImmGetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpBuf, DWORD dwBufLen)
#define WM_IME_SETCONTEXT
HIMC WINAPI ImmGetContext(HWND hWnd)
static struct @1645 ime_composition_test
static void test_ImmIsUIMessage(void)
BOOL WINAPI ImmSetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen, LPCVOID lpRead, DWORD dwReadLen)
struct _tagTRANSMSG TRANSMSG
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI ImmUnlockIMCC(HIMCC imcc)
static void test_ImmGetDescription(void)
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
static LRESULT CALLBACK get_msg_filter(int nCode, WPARAM wParam, LPARAM lParam)
static LRESULT WINAPI test_ime_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
static struct _msg_spy msg_spy
DWORD WINAPI ImmGetImeMenuItemsA(HIMC hIMC, DWORD dwFlags, DWORD dwType, LPIMEMENUITEMINFOA lpImeParentMenu, LPIMEMENUITEMINFOA lpImeMenu, DWORD dwSize)
BOOL WINAPI ImmDisableIME(DWORD idThread)
#define memcpy(s1, s2, n)
#define SetWindowLongPtrA
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
BOOL WINAPI ImmSetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)
static PEXPLICIT_ACCESSW *static HMODULE hmod
DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
HWND WINAPI GetParent(_In_ HWND)
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM)
static DWORD WINAPI test_default_ime_window_cb(void *arg)
static void test_ImmNotifyIME(void)
BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
static LRESULT CALLBACK call_wnd_proc_filter(int nCode, WPARAM wParam, LPARAM lParam)
BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
static imm_msgs * msg_spy_find_next_msg(UINT message, UINT *start)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
static LRESULT(WINAPI *old_imm_wnd_proc)(HWND
DWORD WINAPI ImmGetCandidateListA(HIMC hIMC, DWORD dwIndex, LPCANDIDATELIST lpCandList, DWORD dwBufLen)
PKEYBOARD_LAYOUT GetKeyboardLayout()
BOOL WINAPI ImmConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
#define IME_CONFIG_REGISTERWORD
HIMCC WINAPI ImmCreateIMCC(DWORD size)
BOOL WINAPI ImmGetCompositionWindow(HIMC hIMC, LPCOMPOSITIONFORM lpCompForm)
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
DWORD WINAPI ImmGetIMCCLockCount(HIMCC imcc)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpCandidate)
BOOL WINAPI ImmSetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen, LPCVOID lpRead, DWORD dwReadLen)
BOOL WINAPI ImmGetCandidateWindow(HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandidate)
HHOOK WINAPI SetWindowsHookExW(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD)
static void test_ImmGetContext(void)
HWND WINAPI CreateWindowExA(_In_ DWORD dwExStyle, _In_opt_ LPCSTR lpClassName, _In_opt_ LPCSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
HIMCC WINAPI ImmReSizeIMCC(HIMCC imcc, DWORD size)
static void cleanup(void)
#define WS_OVERLAPPEDWINDOW
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
int strcmp(const char *String1, const char *String2)
BOOL WINAPI SetForegroundWindow(_In_ HWND)
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
#define GetProcAddress(x, y)
static void test_ImmDestroyContext(void)
static HWND get_ime_window(void)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SetWindowLongPtrW
BOOL WINAPI UnregisterClassA(_In_ LPCSTR, HINSTANCE)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
static void test_ime_processkey(void)
static BOOL(WINAPI *pImmAssociateContextEx)(HWND
#define NI_COMPOSITIONSTR
static DWORD WINAPI test_default_ime_with_message_only_window_cb(void *arg)
static void test_ImmMessages(void)
static SERVICE_STATUS status
BOOL WINAPI ImmUnlockIMC(HIMC hIMC)
static DWORD WINAPI test_ImmGetDefaultIMEWnd_thread(void *arg)
UINT WINAPI RegisterWindowMessageA(_In_ LPCSTR)
static UINT WPARAM wparam
static void test_ImmGetCompositionString(void)
static void test_ImmDefaultHwnd(void)