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();
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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));
        }