static void test_ImmMessages(void) { CANDIDATEFORM cf; imm_msgs *msg; HWND defwnd; HIMC imc; UINT idx = 0; HWND hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "Wine imm32.dll test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, GetModuleHandle(0), NULL); ShowWindow(hwnd, SW_SHOWNORMAL); defwnd = ImmGetDefaultIMEWnd(hwnd); imc = ImmGetContext(hwnd); ImmSetOpenStatus(imc, TRUE); msg_spy_flush_msgs(); SendMessage(defwnd, WM_IME_CONTROL, IMC_GETCANDIDATEPOS, (LPARAM)&cf ); do { msg = msg_spy_find_next_msg(WM_IME_CONTROL,&idx); if (msg) ok(!msg->post, "Message should not be posted\n"); } while (msg); msg_spy_flush_msgs(); ImmSetOpenStatus(imc, FALSE); ImmReleaseContext(hwnd, imc); DestroyWindow(hwnd); }
static void test_ImmNotifyIME(void) { static const char string[] = "wine"; char resstr[16] = ""; HIMC imc; BOOL ret; imc = ImmGetContext(hwnd); msg_spy_flush_msgs(); ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); todo_wine { ok(!ret || broken(ret), /* Vista and W2K8 */ "Canceling an empty composition string should fail.\n"); } ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); ImmSetCompositionString(imc, SCS_SETSTR, string, sizeof(string), NULL, 0); msg_spy_flush_msgs(); ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is non empty.\n"); /* behavior differs between win9x and NT */ ret = ImmGetCompositionString(imc, GCS_COMPSTR, resstr, sizeof(resstr)); ok(!ret, "After being cancelled the composition string is empty.\n"); msg_spy_flush_msgs(); ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); todo_wine { ok(!ret || broken(ret), /* Vista and W2K8 */ "Canceling an empty composition string should fail.\n"); } ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); msg_spy_flush_msgs(); ImmReleaseContext(hwnd, imc); }
static void msg_spy_init(HWND hwnd) { msg_spy.hwnd = hwnd; msg_spy.get_msg_hook = SetWindowsHookEx(WH_GETMESSAGE, get_msg_filter, GetModuleHandle(0), GetCurrentThreadId()); msg_spy.call_wnd_proc_hook = SetWindowsHookEx(WH_CALLWNDPROC, call_wnd_proc_filter, GetModuleHandle(0), GetCurrentThreadId()); msg_spy.i_msg = 0; msg_spy_flush_msgs(); }
static void test_ImmIsUIMessage(void) { struct test { UINT msg; BOOL ret; }; static const struct test tests[] = { { WM_MOUSEMOVE, FALSE }, { WM_IME_STARTCOMPOSITION, TRUE }, { WM_IME_ENDCOMPOSITION, TRUE }, { WM_IME_COMPOSITION, TRUE }, { WM_IME_SETCONTEXT, TRUE }, { WM_IME_NOTIFY, TRUE }, { WM_IME_CONTROL, FALSE }, { WM_IME_COMPOSITIONFULL, TRUE }, { WM_IME_SELECT, TRUE }, { WM_IME_CHAR, FALSE }, { 0x287 /* FIXME */, TRUE }, { WM_IME_REQUEST, FALSE }, { WM_IME_KEYDOWN, FALSE }, { WM_IME_KEYUP, FALSE }, { 0, FALSE } /* mark the end */ }; const struct test *test; BOOL ret; if (!pImmIsUIMessageA) return; for (test = tests; test->msg; test++) { msg_spy_flush_msgs(); ret = pImmIsUIMessageA(NULL, test->msg, 0, 0); ok(ret == test->ret, "ImmIsUIMessageA returned %x for %x\n", ret, test->msg); ok(!msg_spy_find_msg(test->msg), "Windows does not send 0x%x for NULL hwnd\n", test->msg); ret = pImmIsUIMessageA(hwnd, test->msg, 0, 0); ok(ret == test->ret, "ImmIsUIMessageA returned %x for %x\n", ret, test->msg); if (ret) ok(msg_spy_find_msg(test->msg) != NULL, "Windows does send 0x%x\n", test->msg); else ok(!msg_spy_find_msg(test->msg), "Windows does not send 0x%x\n", test->msg); } }