LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) { switch (wParam) { case HTCAPTION: { HWND hTopWnd = GetAncestor(hWnd, GA_ROOT); if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) || GetActiveWindow() == hTopWnd) { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam); } break; } case HTSYSMENU: { LONG style = GetWindowLongPtrW( hWnd, GWL_STYLE ); if (style & WS_SYSMENU) { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, lParam); } break; } case HTMENU: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTMENU, lParam); break; } case HTHSCROLL: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam); break; } case HTVSCROLL: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam); break; } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: { DefWndDoButton(hWnd, wParam); break; } case HTLEFT: case HTRIGHT: case HTTOP: case HTBOTTOM: case HTTOPLEFT: case HTTOPRIGHT: case HTBOTTOMLEFT: case HTBOTTOMRIGHT: { /* Old comment: * "make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU" * This was previously done by setting wParam=SC_SIZE + wParam - 2 */ /* But that is not what WinNT does. Instead it sends this. This * is easy to differentiate from HTSYSMENU, because HTSYSMENU adds * SC_MOUSEMENU into wParam. */ SendMessageW(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - (HTLEFT - WMSZ_LEFT), lParam); break; } case HTBORDER: break; } return(0); }
LRESULT DefWndNCLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam) { PWND Wnd = ValidateHwnd(hWnd); switch (wParam) { case HTCAPTION: { HWND hTopWnd = hWnd, parent; while(1) { if ((GetWindowLongW( hTopWnd, GWL_STYLE ) & (WS_POPUP|WS_CHILD)) != WS_CHILD) break; parent = GetAncestor( hTopWnd, GA_PARENT ); if (!parent || parent == GetDesktopWindow()) break; hTopWnd = parent; } if ( NtUserCallHwndLock(hTopWnd, HWNDLOCK_ROUTINE_SETFOREGROUNDWINDOWMOUSE) || GetActiveWindow() == hTopWnd) { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, lParam); } break; } case HTSYSMENU: { LONG style = GetWindowLongPtrW( hWnd, GWL_STYLE ); if (style & WS_SYSMENU) { if( Wnd && !(style & WS_MINIMIZE) ) { RECT rect; HDC hDC = GetWindowDC(hWnd); UserGetInsideRectNC(Wnd, &rect); UserDrawSysMenuButton(hWnd, hDC, &rect, TRUE); ReleaseDC( hWnd, hDC ); } SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, lParam); } break; } case HTMENU: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTMENU, lParam); break; } case HTHSCROLL: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_HSCROLL + HTHSCROLL, lParam); break; } case HTVSCROLL: { SendMessageW(hWnd, WM_SYSCOMMAND, SC_VSCROLL + HTVSCROLL, lParam); break; } case HTMINBUTTON: case HTMAXBUTTON: case HTCLOSE: { DefWndDoButton(hWnd, wParam); break; } case HTLEFT: case HTRIGHT: case HTTOP: case HTBOTTOM: case HTTOPLEFT: case HTTOPRIGHT: case HTBOTTOMLEFT: case HTBOTTOMRIGHT: { /* Old comment: * "make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU" * This was previously done by setting wParam=SC_SIZE + wParam - 2 */ /* But that is not what WinNT does. Instead it sends this. This * is easy to differentiate from HTSYSMENU, because HTSYSMENU adds * SC_MOUSEMENU into wParam. */ SendMessageW(hWnd, WM_SYSCOMMAND, SC_SIZE + wParam - (HTLEFT - WMSZ_LEFT), lParam); break; } case HTBORDER: break; } return(0); }