Когда я запускаю приложение WinForms (или Delphi, см. В конце) в Windows 10 в tablet mode, сенсорная клавиатура не открывается автоматически, когда поле ввода сфокусировано ,Автоматическая всплывающая клавиатура с сенсорным экраном на вкладке ввода WinForms
Я считаю, что это должно произойти автоматически, без каких-либо дополнительных кодов/настроек.
Для теста, у меня есть простейший VS 2015 WinForms настольное приложение с одним TextBox
control.
Это просто по умолчанию, как созданный Visual Studio # проект приложения Windows Forms C. Код не добавлен, свойства не изменены. Только TextBox
был добавлен, понижая из Toolbox (опять же никаких свойств не изменилось):
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;
Чтобы проверить свое предположение, что всплывающее окно должно быть автоматическим:
Я попытался запустить Windows XP версии
notepad.exe
в 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
. Например.:
- How to Use Windows On Screen Keyboard in C# WinForms
- Open and close Windows 8 touch keyboard tabtip under desktop
- How do I close the on-screen keyboard process from C# winform correctly?
- Keyboard Winforms on Windows 10 (surface)
Большинство "решений" предлагают такой код:
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);
B Я не могу поверить, что это может быть «официальным» способом. Если ни для чего другого, то, потому что нет чистого способа скрыть клавиатуру, открытую, запустив TabTip.exe
(решения включают взломы, такие как убийство процесса или отправка Esc).
И на самом деле выше хак не кажется больше работать в ОС Windows 10 Anniversary Update:
Интересно, что я вижу такое же поведение с Delphi/C++ Builder/VCL. Клавиатура не отображается для полей редактирования (TEdit
). Он появляется для комбинированных полей (TComboBox
) и для полей ввода в режиме пароля (PasswordChar
). Интересно, что не для TRichEdit
, что примечательная разница с .NET RichTextBox
, что, возможно, стоит исследовать.
Этот вопрос (вопрос без ответа) описывает то же поведение:
Application written Delphi XE8 touch in edit boxes keyboard not appear in Windows 10.
Вы пробовали это с 2 текстовыми полями и сменой фокуса? У меня было что-то подобное однажды, когда появился ящик ввода, который получил фокус при запуске. Как-то это событие было упущено «ОС (?)». Исправлено, установив фокус запуска на другой элемент управления. – Stefan
@Stefan Конечно. Мне действительно нужно это для большого приложения. Я просто уменьшил проблему до простого тестового приложения только для целей этого вопроса. –
На каком устройстве вы работаете? Windows 10 имеет некоторые внутренние эвристики, чтобы решить, нужно ли им на самом деле показывать клавиатуру или нет, в зависимости от ряда факторов. Режим таблеток недостаточно, чтобы «заставить» клавиатуру отображать. В моей Книге Поверхностей я должен физически отсоединить клавиатуру для OSK, чтобы она показывалась автоматически (или была принудительной с использованием трюков и обходных решений) – o0rebelious0o