protected override void OnCreated(IntPtr hWnd) { base.OnCreated(hWnd); _options.WindowFrameless = true; _framelessInfo = new FramelessInfo(hWnd); _framelessOption = _options.FramelessOption; _dwmFramelessController = new DwmFramelessController(_framelessInfo, _framelessOption, HandleSizeChanged); _dwmFramelessController.HandleCompositionchanged(); _dwmFramelessController.HandleThemechanged(); }
protected override void OnCreated(IntPtr hWnd) { base.OnCreated(hWnd); if (_options.Fullscreen || _options.KioskMode) { throw new NotSupportedException("Fullscreen/Kiok mode is not supported in ChromelyFramelessApp. Please use ChromelyBasicApp instead."); } _options.WindowFrameless = true; _framelessInfo = new FramelessInfo(hWnd); _framelessOption = _options.FramelessOption; _dwmFramelessController = new DwmFramelessController(_framelessInfo, _framelessOption, HandleSizeChanged); _dwmFramelessController.HandleCompositionchanged(); _dwmFramelessController.HandleThemechanged(); }
protected override IntPtr WndProc(IntPtr hWnd, uint message, IntPtr wParam, IntPtr lParam) { WM wmMsg = (WM)message; switch (wmMsg) { case WM.PARENTNOTIFY: { WM wParmLw = (WM)LOWORD((int)wParam); switch (wParmLw) { case WM.LBUTTONDOWN: _dwmFramelessController?.InitiateWindowDrag(hWnd, lParam); return(IntPtr.Zero); default: break; } } break; case WM.DWMCOMPOSITIONCHANGED: _dwmFramelessController?.HandleCompositionchanged(); return(IntPtr.Zero); case WM.LBUTTONDOWN: /* Allow window dragging from any point */ var handlerNullable = _framelessInfo?.Handle; if (handlerNullable.HasValue) { ReleaseCapture(); SendMessageW(handlerNullable.Value, WM.NCLBUTTONDOWN, (IntPtr)HT.CAPTION, IntPtr.Zero); } return(IntPtr.Zero); case WM.NCACTIVATE: /* DefWindowProc won't repaint the window border if lParam (normally a * HRGN) is -1. This is recommended in: * https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/ */ return(base.WndProc(hWnd, message, wParam, new IntPtr(-1))); case WM.NCCALCSIZE: _dwmFramelessController?.HandleNCCalcsize(wParam, lParam); return(IntPtr.Zero); case WM.NCHITTEST: if (_framelessInfo != null) { _framelessInfo.ResizeInMotion = true; var hitTestResultNullable = _dwmFramelessController?.HandleNCHittest(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); _framelessInfo.ResizeInMotion = false; return(hitTestResultNullable.HasValue ? hitTestResultNullable.Value : IntPtr.Zero); } return(IntPtr.Zero); case WM.NCPAINT: /* Only block WM_NCPAINT when composition is disabled. If it's blocked * when composition is enabled, the window shadow won't be drawn. */ var isComposistionEnabedNullable = _framelessInfo?.IsCompositionEnabled; var isComposistionEnabed = isComposistionEnabedNullable.HasValue ? isComposistionEnabedNullable.Value : false; if (!isComposistionEnabed) { return(IntPtr.Zero); } break; case WM.NCUAHDRAWCAPTION: case WM.NCUAHDRAWFRAME: /* These undocumented messages are sent to draw themed window borders. * Block them to prevent drawing borders over the client area. */ return(IntPtr.Zero); case WM.SETICON: case WM.SETTEXT: /* Disable painting while these messages are handled to prevent them * from drawing a window caption over the client area, but only when * composition and theming are disabled. These messages don't paint * when composition is enabled and blocking WM_NCUAHDRAWCAPTION should * be enough to prevent painting when theming is enabled. */ isComposistionEnabedNullable = _framelessInfo?.IsCompositionEnabled; isComposistionEnabed = isComposistionEnabedNullable.HasValue ? isComposistionEnabedNullable.Value : false; var isThemeEnabledNullable = _framelessInfo?.IsThemeEnabled; var isThemeEnabledEnabed = isThemeEnabledNullable.HasValue ? isThemeEnabledNullable.Value : false; if (!isComposistionEnabed && !isThemeEnabledEnabed) { var msgResult = _dwmFramelessController?.HandleMessageInvisible(wmMsg, wParam, lParam); return(msgResult.HasValue ? msgResult.Value : IntPtr.Zero); } break; case WM.THEMECHANGED: _dwmFramelessController?.HandleThemechanged(); break; case WM.WINDOWPOSCHANGED: WINDOWPOS windPos = (WINDOWPOS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOS)); _dwmFramelessController?.HandleWindowPosChanged(windPos); return(IntPtr.Zero); case WM.CAPTURECHANGED: if (lParam == IntPtr.Zero) { _dwmFramelessController?.ResetDragOperation(); } return(IntPtr.Zero); default: break; } return(base.WndProc(hWnd, message, wParam, lParam)); }