ByeongSik Jeon : user32: Post the WM_KEY{DOWN|UP} message whenWM_IME_KEY{DOWN|UP} message is generated by IME .

Alexandre Julliard julliard at winehq.org
Thu May 1 06:38:44 CDT 2008


Module: wine
Branch: master
Commit: 64e64d657c77ee015d234ef504d57cf702aed356
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=64e64d657c77ee015d234ef504d57cf702aed356

Author: ByeongSik Jeon <bsjeon at hanmail.net>
Date:   Wed Apr 30 20:50:19 2008 +0900

user32: Post the WM_KEY{DOWN|UP} message whenWM_IME_KEY{DOWN|UP} message is generated by IME.

---

 dlls/user32/defwnd.c    |   12 ++++++-
 dlls/user32/tests/msg.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index 9d72f9a..ba07ebb 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -843,11 +843,11 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
         break;
 
     case WM_IME_KEYDOWN:
-        result = SendMessageA( hwnd, WM_KEYDOWN, wParam, lParam );
+        result = PostMessageA( hwnd, WM_KEYDOWN, wParam, lParam );
         break;
 
     case WM_IME_KEYUP:
-        result = SendMessageA( hwnd, WM_KEYUP, wParam, lParam );
+        result = PostMessageA( hwnd, WM_KEYUP, wParam, lParam );
         break;
 
     case WM_IME_STARTCOMPOSITION:
@@ -993,6 +993,14 @@ LRESULT WINAPI DefWindowProcW(
         PostMessageW( hwnd, WM_CHAR, wParam, lParam );
         break;
 
+    case WM_IME_KEYDOWN:
+        result = PostMessageW( hwnd, WM_KEYDOWN, wParam, lParam );
+        break;
+
+    case WM_IME_KEYUP:
+        result = PostMessageW( hwnd, WM_KEYUP, wParam, lParam );
+        break;
+
     case WM_IME_SETCONTEXT:
         {
             HWND hwndIME;
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 7f54e61..6d1acb1 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -5067,6 +5067,76 @@ static void test_combobox_messages(void)
     DestroyWindow(parent);
 }
 
+/****************** WM_IME_KEYDOWN message test *******************/
+
+static const struct message WmImeKeydownMsgSeq_0[] =
+{
+    { WM_IME_KEYDOWN, wparam, VK_RETURN },
+    { WM_CHAR, wparam, 'A' },
+    { 0 }
+};
+
+static const struct message WmImeKeydownMsgSeq_1[] =
+{
+    { WM_KEYDOWN, wparam, VK_RETURN },
+    { WM_CHAR,    wparam, VK_RETURN },
+    { 0 }
+};
+
+static LRESULT WINAPI wmime_keydown_procA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    struct message msg;
+
+    trace("wmime_keydown_procA: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam);
+
+    msg.message = message;
+    msg.flags = wparam|lparam;
+    msg.wParam = wParam;
+    msg.lParam = lParam;
+    add_message(&msg);
+
+    return DefWindowProcA(hwnd, message, wParam, lParam);
+}
+
+static void register_wmime_keydown_class(void)
+{
+    WNDCLASSA cls;
+
+    ZeroMemory(&cls, sizeof(WNDCLASSA));
+    cls.lpfnWndProc = wmime_keydown_procA;
+    cls.hInstance = GetModuleHandleA(0);
+    cls.lpszClassName = "wmime_keydown_class";
+    if (!RegisterClassA(&cls)) assert(0);
+}
+
+void test_wmime_keydown_message(void)
+{
+    HWND hwnd;
+    MSG msg;
+
+    trace("Message sequences by WM_IME_KEYDOWN\n");
+
+    register_wmime_keydown_class();
+    hwnd = CreateWindowExA(0, "wmime_keydown_class", NULL, WS_OVERLAPPEDWINDOW,
+                           CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, 0,
+                           NULL, NULL, 0);
+    flush_events();
+    flush_sequence();
+
+    SendMessage(hwnd, WM_IME_KEYDOWN, VK_RETURN, 0x1c0001);
+    SendMessage(hwnd, WM_CHAR, 'A', 1);
+    ok_sequence(WmImeKeydownMsgSeq_0, "WM_IME_KEYDOWN 0", FALSE);
+
+    while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
+    {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    }
+    ok_sequence(WmImeKeydownMsgSeq_1, "WM_IME_KEYDOWN 1", FALSE);
+
+    DestroyWindow(hwnd);
+}
+
 /************* painting message test ********************/
 
 void dump_region(HRGN hrgn)
@@ -10353,6 +10423,7 @@ START_TEST(msg)
     test_static_messages();
     test_listbox_messages();
     test_combobox_messages();
+    test_wmime_keydown_message();
     test_paint_messages();
     test_interthread_messages();
     test_message_conversion();




More information about the wine-cvs mailing list