There's an application that calls DragDetect() on every WM_MOUSEMOVE message, and this breaks handling of mouse events. A simple test app shows that on Windows DragDetect() starts its message loop when left mouse button is pressed.
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/user32/tests/win.c | 17 +++++++++++++++++ dlls/user32/win.c | 10 ++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 6b13d93be14..88989f4064b 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -12293,6 +12293,22 @@ static void test_cancel_mode(void) DestroyWindow(hwnd2); }
+static void test_DragDetect(void) +{ + POINT pt; + BOOL ret; + + ok(!GetCapture(), "got capture window %p\n", GetCapture()); + ok(!(GetKeyState( VK_LBUTTON ) & 0x8000), "got VK_LBUTTON\n"); + + GetCursorPos(&pt); + ret = DragDetect(hwndMain, pt); + ok(!ret, "got %d\n", ret); + + ok(!GetCapture(), "got capture window %p\n", GetCapture()); + ok(!(GetKeyState( VK_LBUTTON ) & 0x8000), "got VK_LBUTTON\n"); +} + START_TEST(win) { char **argv; @@ -12461,6 +12477,7 @@ START_TEST(win) test_other_process_window(argv[0]); test_SC_SIZE(); test_cancel_mode(); + test_DragDetect();
/* add the tests above this line */ if (hhook) UnhookWindowsHookEx(hhook); diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 4d0240f21a8..3c6810f4200 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -3893,9 +3893,15 @@ BOOL WINAPI DragDetect( HWND hWnd, POINT pt ) { MSG msg; RECT rect; - WORD wDragWidth = GetSystemMetrics(SM_CXDRAG); - WORD wDragHeight= GetSystemMetrics(SM_CYDRAG); + WORD wDragWidth, wDragHeight;
+ TRACE( "%p,%s\n", hWnd, wine_dbgstr_point( &pt ) ); + + if (!(GetKeyState( VK_LBUTTON ) & 0x8000)) + return FALSE; + + wDragWidth = GetSystemMetrics(SM_CXDRAG); + wDragHeight= GetSystemMetrics(SM_CYDRAG); SetRect(&rect, pt.x - wDragWidth, pt.y - wDragHeight, pt.x + wDragWidth, pt.y + wDragHeight);
SetCapture(hWnd);