visual teclado hacer form como c# windows winforms 32bit-64bit on-screen-keyboard

hacer - teclado virtual c# windows form



Cómo usar el teclado en pantalla de Windows en C#WinForms (5)

Ahora estoy lanzando el "Teclado táctil" en lugar del "Teclado en pantalla" (que es el teclado que quería en Windows 8) con:

string progFiles = @"C:/Program Files/Common Files/Microsoft Shared/ink"; string keyboardPath = Path.Combine(progFiles, "TabTip.exe"); this.keyboardProc = Process.Start(keyboardPath);

Esto funciona en mi Win7 y Win8, independientemente de mi aplicación de 32 bits en el sistema operativo de 64 bits. Sin embargo, todavía tengo el problema de cerrar el teclado mediante programación cuando termine. El proceso, this.keyboardProc , no parece obtener el identificador, e inmediatamente tiene la propiedad HasExited = true . Esto significa que mis intentos de cerrarlo o matarlo fallan.

De acuerdo con este hilo, si el usuario abre manualmente el teclado (o si lo ejecuto programáticamente), el teclado no se cerrará / ocultará automáticamente cuando el campo de texto pierda el foco: Windows 8 - ¿Cómo descartar el teclado táctil? Intenté la solución de establecer el enfoque en un botón oculto, pero como yo mismo inicié el teclado, no se cierra automáticamente.

  • VS 2010
  • Desarrollo de una aplicación de 32 bits que se ejecuta en sistemas operativos de 64 bits (Windows 7, Windows 8 - aplicación de escritorio)
  • DO#
  • .NET 4.0
  • WinForms

He encontrado muchos hilos al iniciar el teclado en pantalla de Windows ( osk.exe ) desde una aplicación, pero tengo algunos problemas. Parece ser porque estoy ejecutando una aplicación de 32 bits en un sistema operativo de 64 bits. He probado el código publicado por WooCaSh aquí: Teclado en la pantalla en WinForms

Pero ninguno de los tres caminos diferentes funciona para mí. Para la sysnative acceso del sistema, Process.Start falla con "No se puede encontrar la ruta especificada". Para las osk.exe acceso de system32 y osk.exe , osk.exe cuadro de diálogo de error "No se pudo iniciar el teclado en pantalla" .

Encontré una posible solución aquí, que es un poco más complicada de lo que estaba buscando (post by eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. ¿Hay una manera más fácil o correcta de hacer esto?
  2. Esperaba que ejecutar mi aplicación en una tableta ejecutara automáticamente el teclado en pantalla cuando el usuario seleccionara un cuadro de texto, pero no hubo suerte. ¿Es esto normal o me estoy perdiendo algo? Descubrí que el teclado no se inicia automáticamente en Windows 8 cuando está en modo de escritorio (que es mi aplicación): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically/ Aparentemente funciona en tabletas con Windows 7, pero no puedo probar porque solo tengo tabletas con Windows 8 aquí.

El teclado táctil aprovecha la automatización de la interfaz de usuario. Por algunas razones que son un misterio para mí, el cuadro de edición estándar de Windows no implementa la IU automática, mientras que otros controles, como el cuadro combinado, sí lo hacen.

Se puede usar la implementación de la automatización de la interfaz de usuario de UIAutomationClient.dll .

Para que la automatización de la interfaz de usuario se inyecte mágicamente en una aplicación, se debe activar el inicializador de clase de la clase interna UiaCoreApi del ensamblaje.

En puede lograr eso, por ejemplo, llamando aparentemente no-op:

AutomationElement.FromHandle(IntPtr)(-1)

Otra forma es implementar explícitamente la interfaz de usuario de automatización. Para ello, implemente las interfaces ITextProvider / IValueProvider para el control de entrada respectivo.

Para vincular la implementación de las interfaces al control, maneje el mensaje de la ventana WM_GETOBJECT con lParam = RootObjectId .

Para un ejemplo de implementación, vea

Aunque de manera interesante, los controles para los cuales el teclado táctil funciona de manera WM_GETOBJECT (como el cuadro combinado o el cuadro de edición de contraseña, vea la respuesta), no implementan WM_GETOBJECT / RootObjectId . Debe haber una maquinaria diferente detrás de ellos.

La "solución" más común a este problema, para TabTip.exe explícitamente el teclado mediante la ejecución de TabTip.exe o osk.exe , no es aceptable.

Si no es por otra cosa, entonces porque no hay una forma clara de ocultar el teclado abierto mediante la ejecución de TabTip.exe (las soluciones incluyen hacks como matar el proceso o enviar la tecla Esc ).

Y, en realidad, el truco anterior ya no funciona en la actualización de aniversario de Windows 10: Mostrar teclado táctil (TabTip.exe) en la edición de aniversario de Windows 10 .


Iniciar TabTip.exe ya no funciona en Widnows 10 Anniversary Edition. Descubrí una interfaz COM no documentada para controlar el teclado táctil. Verifique el código aquí https://.com/a/40921638/332528


Para que el teclado se abra automáticamente, los controles deben implementar algunos patrones de control de UI Automation, específicamente ITextProvider / IValueProvider. Es una molestia, pero funciona (y es una forma más limpia que lanzar algunos * .exe)

Escribí una aplicación de muestra y un breve artículo aquí: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/


Tuve problemas para cerrar el teclado en pantalla. Puede iniciar el teclado táctil con

string progFiles = @"C:/Program Files/Common Files/Microsoft Shared/ink"; string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe"); onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath);

y cierra todos los teclados con

//Kill all on screen keyboards Process[] oskProcessArray = Process.GetProcessesByName("TabTip"); foreach (Process onscreenProcess in oskProcessArray) { onscreenProcess.Kill(); }

Por alguna razón, onScreenKeyboardProc.Kill () o .Close () no funcionan.