private void ExpandForegroundWindow()
 {
     if (lastWindowState != null)
     {
         WindowManipulationHelper.ReturnForegroundWindowToDefaultMaximizedState(lastWindowState);
     }
 }
        private void KeyboardOpened(Rectangle keyboardPosition)
        {
            Debug.WriteLine("KeyboardOpened");

            if (WindowManipulationHelper.IsForegroundWindowMaximized() &&
                IsKeyboardInDockedMode() &&
                !WindowManipulationHelper.IsForegroundWindowUWP())
            {
                isVisible = true;

                if (TabletModeHelper.IsTabletMode)
                {
                    ShowDock(keyboardPosition);
                    lastWindowState = null;
                }
                else
                {
                    ShrinkForegroundWindow(keyboardPosition);
                }
            }
            else
            {
                lastWindowState = null;
            }
        }
        private void ShrinkForegroundWindow(Rectangle keyboardPosition)
        {
            var taskbarSize     = TaskbarHelper.GetTaskbarSize();
            var taskbarPosition = TaskbarHelper.GetTaskbarPosition();
            var diff            = 0;

            if (taskbarPosition == TaskbarHelper.TaskbarPosition.Bottom)
            {
                diff = -taskbarSize.Height;
            }

            lastWindowState = WindowManipulationHelper.ChangeForegroundWindowToWindowedFullScreen(
                keyboardPosition.Height + diff);
        }
        private async void keyboardStateCheckTimer_Tick(object sender, EventArgs e)
        {
            var isOpen = TouchKeyboardHelper.IsOpen();

            if (isOpen && !isVisible && IsKeyboardInDockedMode())
            {
                keyboardPosition = TouchKeyboardHelper.GetTouchKeyboardPosition();
                if (keyboardPosition != null)
                {
                    KeyboardOpened((Rectangle)keyboardPosition);
                }
            }
            else if (isOpen && isVisible)
            {
                // Make sure keyboard type is not changed from docked.
                if (!IsKeyboardInDockedMode())
                {
                    KeyboardClosed();
                }
                else
                {
                    // Check for keyboard resize
                    var currentKeyboardPosition = TouchKeyboardHelper.GetTouchKeyboardPosition();

                    if (currentKeyboardPosition != null && keyboardPosition != null &&
                        MuchDifference((Rectangle)currentKeyboardPosition, (Rectangle)keyboardPosition, keyboardDockedPositionMaxDiff))
                    {
                        Debug.WriteLine("Keyboard height changed");
                        UpdateKeyboardHeight((Rectangle)currentKeyboardPosition);
                        keyboardPosition = currentKeyboardPosition;
                    }


                    // Check for foreground app change
                    this.Invoke(new MethodInvoker(() =>
                    {
                        try
                        {
                            if (!TabletModeHelper.IsTabletMode && currentKeyboardPosition != null)
                            {
                                var currentForegroundWindow = WindowManipulationHelper.GetForegroundWindow();
                                if (currentForegroundWindow != lastWindowState.windowHandle)
                                {
                                    Debug.WriteLine("Foreground window changed");
                                    ExpandForegroundWindow();
                                    ShrinkForegroundWindow((Rectangle)currentKeyboardPosition);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("Exception in Check for foreground app change: " + ex.ToString());
                        }
                    }));
                }
            }
            else if (!isOpen && isVisible)
            {
                KeyboardClosed();
            }
        }