c# - tactil - Aparece automáticamente el teclado táctil de la tableta en el foco de entrada de WinForms
teclado tactil no aparece automaticamente windows 10 (5)
Como lo insinuó la respuesta de Ofek Shilon , parece que el teclado táctil puede aprovechar la automatización de la interfaz de usuario .
Uno puede usar la implementación de la automatización de UI desde UIAutomationClient.dll
.
Para que la automatización de UI se inyecte mágicamente en una aplicación, se debe activar el inicializador de clase de la clase interna de ensamblaje UiaCoreApi
.
On puede lograr eso, por ejemplo, llamando a aparente no-op:
AutomationElement.FromHandle(IntPtr)(-1)
Otra forma es implementar la IU de automatización de forma explícita. Para ese implementar, las interfaces ITextProvider
/ IValueProvider
para el control de entrada respectivo.
Para enlazar la implementación de las interfaces con el control, maneje el mensaje de ventana WM_GETOBJECT
con lParam
= RootObjectId
.
Para ver un ejemplo de implementación, consulte
- La respuesta de tombam a Cómo usar Windows en pantalla Teclado en C # WinForms
- o directamente el artículo del póster Implementación de TextBox con el teclado táctil en pantalla .
Aunque curiosamente, los controles, para los que el teclado táctil funciona de fábrica (como el cuadro combinado o el cuadro de edición de contraseña, vea la respuesta), no implemente el WM_GETOBJECT
/ RootObjectId
. Debe haber una maquinaria diferente detrás de ellos.
Cuando ejecuto una aplicación WinForms (o Delphi, ver al final) en Windows 10 en modo tableta , un teclado táctil no aparece automáticamente cuando se enfoca un cuadro de entrada.
Creo que esto debería suceder automáticamente, sin ningún código / configuración adicional.
Para una prueba, tengo la aplicación de escritorio WinForms VS 2015 más simple con un solo control TextBox
.
Es simplemente el proyecto predeterminado de Windows Forms Application C # creado por Visual Studio. Sin código agregado, sin propiedades cambiadas. Solo se agregó el TextBox
, soltándolo de la Caja de Herramientas (nuevamente no se cambiaron las propiedades):
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;
Para verificar mi suposición de que la ventana emergente debería ser automática:
Intenté ejecutar Windows XP versión de
notepad.exe
en Windows 10. Aparece automáticamente el teclado táctil. Dudo que Windows XP tenga algún soporte explícito para los teclados táctiles.También probé algunas aplicaciones antiguas de MFC (por ejemplo, FileZilla 2.2.15 desde 2005). También muestra el teclado táctil en todos sus cuadros de entrada. De nuevo, estoy bastante seguro, el MFC tampoco tenía soporte explícito para los teclados táctiles.
Lo mismo para las aplicaciones basadas en wxWidgets (por ejemplo, FileZilla 3.x).
Parece que hay algo roto en WinForms que impide la ventana emergente automática. Curiosamente, el pop-up automático funciona:
- para cuadros combinados (editables) (
ComboBox
conDropDownStyle = DropDown
) - para cuadros de texto en modo de contraseña (
TextBox.PasswordChar
) - para cuadros de texto enriquecidos (
RichTextBox
) - cuando el cuadro de entrada tiene foco en el momento en que se quita el teclado del hardware (lo pruebo volteando la pantalla del portátil Lenovo Yoga), pero nunca después.
He visto todos los consejos sobre una ventana emergente explícita ejecutando el TabTip.exe
. P.ej:
- Cómo usar Windows en pantalla Teclado en C # WinForms
- Abre y cierra la pestaña de teclado táctil de Windows 8 debajo del escritorio
- ¿Cómo cierro correctamente el proceso del teclado en pantalla de C # winform?
- Winforms del teclado en Windows 10 (superficie)
La mayoría de las "soluciones" ofrecen un código como este:
var progFiles = @"C:/Program Files/Common Files/Microsoft Shared/ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);
Pero no puedo creer que esta sea la forma "oficial". Si no es por nada, porque no hay una manera clara de ocultar el teclado abierto ejecutando TabTip.exe
(las soluciones incluyen TabTip.exe
como matar el proceso o enviar la tecla Esc ).
Y en realidad, el truco anterior ya no parece funcionar en la actualización de aniversario de Windows 10:
- Mostrar teclado táctil (TabTip.exe) en la edición de Windows 10 Anniversary
Curiosamente, veo el mismo comportamiento con las aplicaciones Delphi / C ++ Builder / VCL. El teclado no aparece para cuadros de edición ( TEdit
). Aparece para los cuadros combinados ( TComboBox
) y para los cuadros de edición en el modo de contraseña ( PasswordChar
). Curiosamente, no para TRichEdit
, cuál es la diferencia notable de .NET RichTextBox
, que tal vez valga la pena investigar.
Esta pregunta (sin respuesta) describe un comportamiento idéntico:
La aplicación escrita Delphi XE8 touch en el cuadro de edición de teclado no aparece en Windows 10 .
He taptip.exe
este camino varias veces y solo he podido implementar la opción taptip.exe
. Y a su vez cierra la ventana matando el proceso. También descubrí que con algunos hacks de registro puede obtener el teclado predeterminado para el panel de escritura a mano, si así lo desea. Pero eso solo funciona en Win8 y falla en Win10. Esto es lo que hice en caso de que alguien más lo encuentre útil:
RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("Software//Microsoft//TabletTip//1.7");
registryKey?.SetValue("KeyboardLayoutPreference", 0, RegistryValueKind.DWord);
registryKey?.SetValue("LastUsedModalityWasHandwriting", 1, RegistryValueKind.DWord);
Process.Start(@"C:/Program Files/Common Files/Microsoft Shared/ink/TabTip.exe");
Necesito dar crédito a esta publicación por la idea del registro: Windows 8 Desktop App: abra tabtip.exe en el teclado secundario (para el cuadro de texto numérico)
La causa principal parece ser que el cuadro de texto de Winforms no es un AutomationElement, mientras que el resto de los controles mencionados (ComboBoxes, etc.) sí lo están.
Citando la respuesta aceptada por Markus von und zu Heber aquí :
Lo encontramos en el artículo " Teclado táctil automático para cuadros de texto en aplicaciones WPF en Windows 8+ ", pero también funciona muy bien (¡y aún más fácil!) Para winforms. ¡Gracias, Dmitry Lyalin!
Inserta una referencia a UIAutomationClient.dll en tu proyecto
En el controlador de carga de formulario de la ventana principal de la aplicación, inserte el siguiente código:
var asForm = System.Windows.Automation.AutomationElement.FromHandle(this.Handle);
Por lo que puedo decir, el lanzamiento de osk.exe
o tabtip.exe
es la forma "estándar" de hacer que esto funcione. Hasta ahora no he encontrado una solución "oficial".
Sin embargo, si fuera yo quien hiciera esto, no mataría el proceso ni enviaría claves para intentar descartar el teclado. En su lugar, puede obtener el identificador de ventana cuando inicia el proceso y usarlo para minimizar la ventana y ocultarla de la barra de tareas.
Alguien aquí ha obtenido el asa de la ventana solo para cerrarlo, pero te da la idea: Mostrar y ocultar el teclado de Windows 8 en pantalla de WPF
Si me necesitas, avísame y veré si puedo encontrar el tiempo para hacer un ejemplo completo.
Use un RichTextBox en lugar de un control TextBox. El RichTextBox es compatible con el teclado táctil y se abrirá automáticamente el teclado cuando se obtiene el foco. (similar a otros controles de entrada, como el cuadro combinado)
El RichTextBox también admite las mismas propiedades que el TextBox, por lo que debería ser un cambio en la mayoría de los casos. (Ambos controles derivan de TextBoxBase)
Me he dado cuenta de que si el teclado táctil se ha apagado después de que aparece, es posible que tenga que tocar dos veces en el control para que aparezca una copia de seguridad.