Размер окна WPF не зависит от клавиатуры TabTip

У меня есть приложение WPF, работающее на планшете Windows 8.1. приложение использует следующий метод для отображения виртуальной клавиатуры:

public static void OpenKeyboard()
{
    ProcessStartInfo startInfo =
        new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
        {
            WindowStyle = ProcessWindowStyle.Hidden
        };
    Process.Start(startInfo);
}

Однако размер активного окна, который отображается на клавиатуре сверху, не изменяется соответствующим образом, что означает, что если у меня есть ScrollViewer, окружающий все элементы моего окна, он не отвечает на клавиатуру.
Есть ли способ сделать мои окна осведомленными о присутствии клавиатуры?
Обновить
Пробовал регистрироваться в событии SizeChanged но не поднимался, когда клавиатура всплывает.

Ответ 1

Поскольку TabTip.exe - это отдельный процесс, он не запускает никаких событий в вашем приложении WPF. Так как win 8.1 tabtip больше не изменяет размер окна автоматически. (было много жалоб по этому поводу)

Есть несколько способов сделать это вручную. Во-первых, приложения Win8 имеют так называемые страницы "LayoutAware". Нечто подобное можно сделать в WPF с помощью VisualStateManager. Это довольно сложно и может быть не лучшим решением, но я все же включил его (решение VisualStateManager здесь

Другой способ - извлечь процесс табуляции из списка активных процессов, рассчитать его ширину и высоту и использовать его для изменения размеров экранов вручную. Tabtip, если я правильно помню, около 270 в высоту. Вы также можете напрямую изменить размеры своих экранов, как только появится процесс. Что-то вроде этого;

  public void OpenKeyboard()
         {
             ProcessStartInfo startInfo =
                 new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
                 {
                     WindowStyle = ProcessWindowStyle.Hidden
                 };
             Process.Start(startInfo);

             //this = your window
             this.Height -= 270;

         }

Есть еще один более чистый способ. Это немного сложно, и я сам еще не пробовал. Можно захватить процесс и изменить его размер, где вы хотите. Возможно, вы сможете сделать это с помощью вызова Windows API 'findWindow()', но, насколько я знаю, это не всегда работает с tabtip, вам, возможно, придется использовать P/Invoke. Для начала я нашел несколько довольно хороших источников, из которых я не буду красть, скопировав код здесь; Как изменить размер другого окна приложения в С#

Изменение размера и позиции другого приложения с помощью P/invoke (win32)

Я надеюсь, что вы найдете эту информацию полезной. Я знаю, как ты себя чувствуешь, и я боролся с табаком чаще, чем мне нравится.

Сноска; не проще ли просто уменьшить максимальную высоту окна и переместить его в верхнюю часть экрана, когда вызывается osk, и вернуть его, когда его убьют?

Ответ 2

Насколько я знаю, это происходит, если окно максимально или не изменяется. Убедитесь, что его состояние не максимизируется, прежде чем открывать клавиатуру.

Ответ 3

В другом ответе, который я дал из своего собственного исследования работы с планшетами, следующая ссылка S/O может вам помочь.

Приложение для планшета, функция автоматического поворота и высота панели задач

Я нашел множество вещей, которые не были классными, но придумали некоторые моменты для понимания. В зависимости от клавиатуры, действительно ли она накладывается или является частью закрепленной панели задач в нижней части окна с другими открытыми задачами. Если это так, то это по сути изменит доступные размеры окна, почти как при переходе пользователя с более низкого разрешения на более высокое (или высокое/низкое). Это фактически изменяет размеры порта представления для отображаемых окон. Вы можете подключиться к

SystemEvents.UserPreferenceChanged and 
SystemEvents.DisplaySettingsChanged 

обнаруживать и инициировать любые изменения размера, которые вам нужны. Существует также код, заставляющий планшет оставаться в одной ориентации. Я нуждался в этом, потому что на нашем планшете есть сканер штрих-кода, и имеет смысл всегда иметь планшет со сканером, НЕ указывающим на человека, поэтому мы заблокировали его в определенном направлении во время работы приложения.

И, наконец, как вы ЗНАЕТЕ, что вы вошли (или вышли из режима планшета). Это показывает, как соединиться с ManagementEventWatcher, чтобы обнаружить, когда запись реестра изменяется в интерактивном режиме, например, ротация или отстыковка от станции, и становится свободной для использования в режиме планшета.

Из ваших отзывов, давайте попробуем это. Из моей версии TabTip (планшет Surface Pro) в левом верхнем углу находятся настройки клавиатуры. Исходя из этого, если вы нажмете на нее, откроется диалоговое окно, в котором можно использовать различные стили клавиатуры от полной ширины, сокращенной, разделенной клавиатуры и даже стилуса для прямой записи. Ниже это вариант, чтобы ваша клавиатура была закреплена как панель задач (левую кнопку, обведенную красным) против плавающего окна поверх других (я полагаю, что ваша работает). Попробуйте перевести клавиатуру в состояние DOCKED, затем проверьте, изменились ли параметры планшета и настройки среды окна. Работал на меня.

enter image description here