From 9e4d2f1f9e9529bc1e8b9d8c3ab2e0b398fbf2b5 Mon Sep 17 00:00:00 2001 From: Mark Jansen Date: Sat, 4 Nov 2017 15:00:54 +0100 Subject: [PATCH] [WIN32K] Check if the window being destroyed is currently tracked. (#103) * [WIN32K] Check if the window being destroyed is currently tracked. CORE-13619 --- win32ss/user/ntuser/mouse.c | 20 ++++++++++++++++++++ win32ss/user/ntuser/window.c | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/win32ss/user/ntuser/mouse.c b/win32ss/user/ntuser/mouse.c index fc3827e3450..46dfcfdd4ff 100644 --- a/win32ss/user/ntuser/mouse.c +++ b/win32ss/user/ntuser/mouse.c @@ -342,6 +342,26 @@ UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected) return TRUE; } +VOID +FASTCALL +IntRemoveTrackMouseEvent( + PDESKTOP pDesk) +{ + /* Generate a leave message */ + if (pDesk->dwDTFlags & DF_TME_LEAVE) + { + UINT uMsg = (pDesk->htEx != HTCLIENT) ? WM_NCMOUSELEAVE : WM_MOUSELEAVE; + UserPostMessage(UserHMGetHandle(pDesk->spwndTrack), uMsg, 0, 0); + } + /* Kill the timer */ + if (pDesk->dwDTFlags & DF_TME_HOVER) + IntKillTimer(pDesk->spwndTrack, ID_EVENT_SYSTIMER_MOUSEHOVER, TRUE); + + /* Reset state */ + pDesk->dwDTFlags &= ~(DF_TME_LEAVE|DF_TME_HOVER); + pDesk->spwndTrack = NULL; +} + BOOL FASTCALL IntQueryTrackMouseEvent( diff --git a/win32ss/user/ntuser/window.c b/win32ss/user/ntuser/window.c index b8a3b59bfe9..9c7627cece4 100644 --- a/win32ss/user/ntuser/window.c +++ b/win32ss/user/ntuser/window.c @@ -381,6 +381,12 @@ DWORD FASTCALL IntGetWindowContextHelpId( PWND pWnd ) return HelpId; } + +VOID +FASTCALL +IntRemoveTrackMouseEvent( + PDESKTOP pDesk); + /*********************************************************************** * IntSendDestroyMsg */ @@ -422,6 +428,12 @@ static void IntSendDestroyMsg(HWND hWnd) { co_IntDestroyCaret(ti); } + + /* If the window being destroyed is currently tracked... */ + if (ti->rpdesk->spwndTrack == Window) + { + IntRemoveTrackMouseEvent(ti->rpdesk); + } } /* If the window being destroyed is the current clipboard owner... */ -- 2.17.1