Когда я запускаю приложение WinForms (или Delphi, см. в конце) в Windows 10 в режиме планшета, сенсорная клавиатура не появляется автоматически, когда фокус ввода находится в фокусе.
Я считаю, что это должно происходить автоматически, без какого-либо дополнительного кода/настройки.
Для теста у меня самое простое настольное приложение VS 2015 WinForms с одним TextBox
элементом управления.
Это просто проект С# приложения Windows Forms по умолчанию, созданный Visual Studio. Код не добавлен, свойства не изменены. Просто TextBox
был добавлен путем удаления из панели инструментов (опять же, свойства не изменились):
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox1.Location = new System.Drawing.Point(64, 27);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;
Чтобы проверить мое предположение, что всплывающее окно должно быть автоматическим:
Я пытался запустить версию
notepad.exe
для Windows XP на Windows 10. Она автоматически выдает сенсорную клавиатуру. Я сомневаюсь, что в Windows XP была какая-то явная поддержка сенсорных клавиатур.Я также попробовал некоторые древние приложения MFC (например, FileZilla 2.2.15 от 2005 года). Он также выскакивает сенсорную клавиатуру на всех своих полях ввода. Опять же, я почти уверен, что в MFC также не было явной поддержки сенсорных клавиатур.
То же самое для приложений, построенных на wxWidgets (например, FileZilla 3.x).
Похоже, что в WinForms что-то сломалось, что мешает автоматическому всплывающему окну. Интересно, что автоматическое всплывающее окно работает:
- для (редактируемых) полей со списком (
ComboBox
сDropDownStyle = DropDown
) - для текстовых полей в режиме пароля (
TextBox.PasswordChar
) - для расширенных текстовых полей (
RichTextBox
) - когда поле ввода находится в фокусе в тот момент, когда аппаратная клавиатура "удалена" (я проверяю это, переворачивая экран на ноутбуке Lenovo Yoga), но не после.
Я видел все подсказки о явном всплывающем окне, запустив TabTip.exe
. Например.:
- Как использовать экранную клавиатуру Windows в С# WinForms
- Открытие и закрытие вкладки сенсорной клавиатуры Windows 8 под рабочим столом
- Как правильно закрыть экранную клавиатуру из С# winform?
- Клавиатура Winforms под Windows 10 (поверхность)
Большинство "решений" предлагают такой код:
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);
Но я не могу поверить, что это может быть "официальным" способом. Хотя бы потому, что нет чистого способа скрыть открытую клавиатуру, запустив TabTip.exe
(решения включают в себя такие хаки, как уничтожение процесса или отправка клавиши Esc).
И на самом деле вышеупомянутый хак больше не работает в Windows 10 Anniversary Update:
Интересно, что я вижу такое же поведение с приложениями Delphi/C++ Builder/VCL. Клавиатура не открывается для полей редактирования (TEdit
). Он появляется для полей со списком (TComboBox
) и для полей редактирования в режиме пароля (PasswordChar
). Интересно не для TRichEdit
, в чем заметное отличие от .NET RichTextBox
, которое, возможно, стоит исследовать.
Этот (без ответа) вопрос описывает идентичное поведение:
Приложение, написанное Delphi XE8 touch, в полях редактирования клавиатуры не отображается в Windows 10.