Requisitos para el editor de métodos de entrada (IME) personalizado
Estas instrucciones y requisitos pueden ayudar a desarrollar un editor de métodos de entrada (IME) para ayudar a un usuario a introducir texto en un idioma que no se puede representar fácilmente en un teclado QWERTY estándar.
Para información general sobre los IME, consulte Editor de métodos de entrada (IME).
IME predeterminado
Un usuario puede seleccionar cualquiera de los IME activos (Configuración -> Hora e idioma -> Idioma -> Idiomas preferidos -> Paquete de idiomas - Opciones) para que sea el IME predeterminado para su idioma preferido.
Seleccione el teclado predeterminado en la pantalla Configuración de opciones de idioma para el idioma preferido.
Importante
No se recomienda escribir directamente en el Registro para establecer el teclado predeterminado para su IME personalizado.
Requisitos de compatibilidad
A continuación, se muestran los requisitos de compatibilidad básicos para un IME personalizado.
IME debe ser compatible con aplicaciones de Windows
Use Text Services Framework (TSF) para implementar los IME. Anteriormente, tenía la opción de usar el Administrador de métodos de entrada (IMM32) para los servicios de entrada. Ahora, el sistema bloquea los IME que se implementan mediante el Administrador de métodos de entrada (IMM32).
Cuando se inicia una aplicación, TSF carga el archivo DLL del IME para el IME seleccionado actualmente por el usuario. Cuando se carga un IME, está sujeto a las mismas restricciones de contenedor que la aplicación. Por ejemplo, un IME no puede acceder a Internet si una aplicación no ha solicitado acceso a Internet en su manifiesto. Este comportamiento garantiza que los IME no puedan infringir los contratos de seguridad.
TSF es el intermediario entre la aplicación y el IME. TSF comunica los eventos de entrada al IME y recibe los caracteres de entrada del IME después de que el usuario seleccionó un carácter.
Este comportamiento es el mismo que las versiones anteriores de Windows, pero la carga en una aplicación de Windows afecta a las posibles funcionalidades de un IME.
Si el IME debe proporcionar una funcionalidad o UI diferentes entre aplicaciones de Windows y aplicaciones de escritorio, asegúrese de que el archivo DLL cargado por TSF comprueba en qué tipo de aplicación se carga. Llame al método ITfThreadMgrEx::GetActiveFlags en el IME y compruebe la marca TF_TMF_IMMERSIVEMODE, por lo que el IME desencadena una lógica de aplicación diferente en función del resultado.
Las aplicaciones de Windows no admiten IME de Table Text Service (TTS).
Nota:
Algunas herramientas para generar IME de TTS producen IME que Windows marca como software malicioso.
IME debe ser compatible con la bandeja del sistema
No hay ninguna barra de idioma para alojar iconos del IME. En su lugar, se muestra un indicador de entrada en la bandeja del sistema que indica la opción de entrada actual. El indicador de entrada muestra solo el icono de personalización de marca del IME para indicar el IME que se ejecuta actualmente. Además, hay un icono de modo de IME que se muestra a la izquierda del icono de personalización de marca de IME para que los usuarios hagan el conmutador de modo de IME que se usa con mayor frecuencia, como activar o desactivar el IME.
El indicador de entrada muestra el icono de personalización de marca de IME y el icono de modo solo para los IME compatibles. Los IME que no son compatibles no tienen el icono de personalización de marca y el icono de modo que se muestran en la bandeja del sistema. En su lugar, el indicador de entrada muestra la abreviatura del idioma en lugar del icono de personalización de marca de IME.
Almacene los iconos del IME en un archivo .dll o .exe, en lugar de un archivo .ico independiente. El diseño de iconos de IME debe seguir las instrucciones descritas en la siguiente sección instrucciones de diseño de la UI.
Icono de personalización de marca de IME
El indicador de entrada obtiene el icono de personalización de marca de IME del archivo .dll del IME mediante el id. de recurso que define el IME cuando se registró en el sistema.
Icono del modo de IME
Es posible que algunos IME necesiten confiar en el indicador de entrada que se muestra en la bandeja del sistema para mostrar el icono del modo de IME. En este caso, el IME pasa el icono de modo de IME al indicador de entrada mediante GUID_LBI_INPUTMODE.
Al pasar los iconos del modo de IME al indicador de entrada de la bandeja del sistema, el tamaño predeterminado del icono del modo de IME es de 16 x 16 píxeles. El escalado de la UI sigue el valor de ppp.
Al pasar el icono del modo de IME al indicador de entrada en UAC (control de cuentas de usuario en Escritorio seguro), el tamaño predeterminado del icono del modo de IME es de 20 x 20 píxeles. El icono de escalado de la UI para el modo de IME en UAC sigue el valor de PPP.
El IME debe funcionar en el contenedor de la aplicación
Algunas funciones del IME se ven afectadas en un contenedor de aplicaciones.
- Archivos de diccionario: con frecuencia, los IME tienen archivos de diccionario de solo lectura para asignar entradas de usuario a caracteres específicos. Para acceder a estos archivos desde dentro de un contenedor de aplicaciones, el IME debe colocarlos en los directorios Archivos de programa o Windows. De manera predeterminada, estos directorios se pueden leer desde un contenedor de aplicaciones, por lo que los IME pueden acceder a los archivos de diccionario que se almacenan en estas ubicaciones. Si el IME debe almacenar el archivo de diccionario en otro lugar, debe manipular explícitamente las listas de control de acceso (ACL) de los archivos de diccionario para permitir el acceso desde los contenedores de aplicaciones.
- Actualización de Internet: si el IME necesita actualizar los diccionarios mediante datos de Internet, no puede hacerlo de manera confiable dentro de un contenedor de aplicaciones, ya que el acceso a Internet no siempre está permitido. En su lugar, el IME debe ejecutar un proceso de escritorio independiente responsable de actualizar los archivos de diccionario con datos de Internet.
- Aprendizaje inmediato: si un IME se ejecuta en un contenedor de aplicaciones que tiene acceso a Internet, no hay ninguna restricción en los puntos de conexión con los que el IME puede comunicarse. En este caso, un IME puede utilizar un servidor en la nube para proporcionar servicios de aprendizaje inmediato. Algunos IME descargan y cargan la entrada del usuario de inmediato, mientras este escribe. Dado que el acceso a Internet no está garantizado en un contenedor de aplicaciones, es posible que esto no siempre se permita.
- Compartir información entre procesos: es posible que los IME deban compartir datos acerca de las preferencias de entrada del usuario entre aplicaciones que se encuentran en distintos contenedores de aplicaciones. Utilice un servicio web para compartir datos entre aplicaciones.
Importante
Si intenta evitar las reglas de seguridad del contenedor de aplicaciones, el IME puede tratarse como software malicioso y bloquearse.
IME y teclado táctil
El IME debe garantizar que la UI del panel de candidato y otros elementos de la UI no se dibujen debajo del teclado táctil. El teclado táctil se muestra en una banda de orden Z superior a todas las aplicaciones, y la UI del IME se muestra en la misma banda de orden Z que la aplicación en la que está activa. Como resultado, el teclado táctil se puede superponer y ocultar la UI del IME. En la mayoría de los casos, la aplicación debe cambiar el tamaño de la ventana para tener en cuenta el teclado táctil. Si una aplicación no cambia el tamaño, el IME todavía puede utilizar la API InputPane para obtener la posición del teclado táctil. El IME consulta la propiedad Location o registra un controlador para los eventos Show y Hide del teclado táctil. El evento Show se genera siempre que el usuario pulsa en un campo de edición, incluso si el teclado táctil se muestra actualmente. El IME puede utilizar esta API para obtener el espacio de pantalla que utiliza el teclado táctil antes de que el IME dibuje la UI de candidato (u otra) y para volver a desplazar la UI de los IME para evitar dibujar debajo del teclado táctil.
Especificar la distribución del teclado táctil preferida
El IME puede especificar qué distribución del teclado táctil se va a utilizar y está habilitado para trabajar con distribuciones optimizadas para la función táctil. Esta funcionalidad se limita a los IME para los idiomas de entrada coreano, japonés, chino simplificado y chino tradicional.
Hay siete distribuciones compatibles con el teclado táctil, tres de las cuales son distribuciones clásicas y cuatro de las cuales son distribuciones optimizadas para la función táctil. Las distribuciones clásicas se ven y se comportan como un teclado físico.
Las tres distribuciones clásicas son para introducir chino tradicional en diferentes formas:
- Entrada basada fonética
- Entrada de cangjie
- Entrada de dayi
Además de las distribuciones clásicas, hay una distribución optimizada para la función táctil para cada uno de los idiomas de entrada coreano, japonés, chino simplificado y chino tradicional.
Para utilizar esta funcionalidad, el IME debe implementar la interfaz ITfFnGetPreferredTouchKeyboardLayout, que exporta el IME mediante la API ITfFunctionProvider de Text Services Framework.
Si el IME no admite la interfaz ITfFnGetPreferredTouchKeyboardLayout, el uso del IME da como resultado la distribución clásica predeterminada para el idioma que muestra el teclado táctil.
Si el IME debe establecer una de las distribuciones clásicas como preferida, no se requiere ningún trabajo adicional en el IME más allá de admitir las interfaces ITfFnGetPreferredTouchKeyboardLayout e ITfFunctionProvider. Pero se requiere trabajo adicional en el IME para funcionar con las distribuciones optimizadas para la función táctil, y esto se describe en la sección siguiente.
Distribución optimizada para la función táctil
Los teclados optimizados para la función táctil para los idiomas de entrada coreano, japonés, chino simplificado y chino tradicional muestran un diseño diferente para los modos de conversión de IME activado e IME desactivado. Hay una tecla en el teclado táctil para establecer el modo de conversión de IME en Activado o Desactivado, pero el modo de IME del teclado también puede cambiar como cambios de foco entre los controles de edición.
Los teclados optimizados para la función táctil para los idiomas de entrada japonés, chino simplificado y chino tradicional contienen una tecla, o teclas, que el IME utiliza para navegar por las páginas de candidatos. Para chino simplificado y japonés, la tecla de la página de candidatos se muestra en la distribución optimizada para la función táctil. Para chino tradicional, hay teclas independientes para las páginas de candidatos anteriores y siguientes.
Cuando se presionan estas teclas, el teclado táctil llama a la función SendInput para enviar los siguientes caracteres de área de uso privado Unicode a la aplicación del foco, que el IME puede interceptar y en la que puede actuar:
- Página siguiente (0xF003): se envía cuando se presiona la tecla de página de candidatos en el teclado optimizado para la función táctil para chino simplificado y japonés, o cuando se presiona la tecla de página siguiente en el teclado optimizado para la función táctil para chino tradicional.
- Página anterior (0xF004): se envía cuando se presiona la tecla de página de candidatos al mismo tiempo que la tecla Mayús en el teclado optimizado para la función táctil para chino simplificado y japonés, o cuando se presiona la tecla de página anterior en el teclado optimizado para la función táctil para chino tradicional.
Estos caracteres se envían como entrada Unicode. En el párrafo siguiente se detalla cómo extraer la información de caracteres durante las notificaciones del receptor de eventos clave que recibirá el IME de Text Services Framework. Estos valores de carácter no se definen en ningún archivo de encabezado, por lo que deberá definirlos en el código.
Para interceptar la entrada del teclado, el IME debe registrarse como receptor de eventos de clave. Para la entrada Unicode que se genera mediante la función SendInput, el parámetro WPARAM de las devoluciones de llamada ITfKeyEventSink (OnKeyDown, OnKeyUp, OnTestKeyDown, OnTestKeyUp) siempre contiene la clave virtual VK_PACKET y no identifica el carácter directamente.
Implemente la siguiente secuencia de llamadas para acceder al carácter:
// Keyboard state
BYTE abKbdState[256];
if (!GetKeyboardState(abKbdState))
{
return 0;
}
// Map virtual key to character code
WCHAR wch;
if (ToUnicode(VK_PACKET, 0, abKbdState, &wch, 1, 0) == 1)
{
return wch;
}
Integración de búsqueda de IME
Proporcione a los usuarios características de búsqueda mediante el contrato e integración de búsqueda con el panel de búsqueda.
Sugerencias del panel de búsqueda e IME
El panel de búsqueda es una ubicación central para que los usuarios hagan búsquedas en todas sus aplicaciones. Para los usuarios de IME, Windows proporciona una experiencia de búsqueda única que permite que los IME compatibles se integren con Windows para mejorar la eficacia y la facilidad de uso.
Los usuarios que escriben con un IME compatible con la búsqueda obtienen dos ventajas principales:
- Interacción sin problemas entre el IME y la experiencia de búsqueda. Los candidatos del IME se muestran insertados en el cuadro de búsqueda sin que se oculten las sugerencias de búsqueda. El usuario puede usar el teclado para navegar sin problemas entre el cuadro de búsqueda, los candidatos de conversión de IME y las sugerencias de búsqueda.
- Acceso más rápido a los resultados y sugerencias relevantes proporcionados por las aplicaciones. La aplicación tiene acceso a todos los candidatos de conversión actuales para proporcionar sugerencias más relevantes. Para priorizar mejor las sugerencias de búsqueda, las conversiones se proporcionan a las aplicaciones en orden de relevancia. Los usuarios buscan y seleccionan el resultado que quieren sin convertir, solo con la escritura fonética.
Un IME es compatible con la experiencia de búsqueda integrada si cumple los siguientes criterios:
- Compatible con el shell de estilo de Windows.
- Implemente las API de modo UILess de TSF. Para más información, consulte Introducción al modo de UILess.
- Implemente las API de integración de búsqueda de TSF, ITfFnSearchCandidateProvider e ITfIntegratableCandidateListUIElement.
Cuando se activa en el panel de búsqueda, un IME compatible se coloca en modo de UIless y no puede mostrar su UI. En su lugar, envía candidatos de conversión a Windows, que los muestra en el control de lista de candidatos insertados, como se muestra en la captura de pantalla anterior.
Además, el IME envía candidatos que se deben utilizar para ejecutar la búsqueda actual. Estos candidatos podrían ser los mismos que los candidatos de conversión, o podrían adaptarse a la búsqueda.
Los candidatos de búsqueda adecuados cumplen los siguientes criterios:
- No se superpone ningún prefijo. Por ejemplo, 北京大学 y北京 son redundantes porque uno es un prefijo del otro.
- No hay candidatos redundantes. Cualquier candidato redundante no es útil para la búsqueda porque no ayuda a filtrar los resultados. Por ejemplo, cualquier resultado que coincida con 北京大学 también coincide con 北京.
- Sin candidato de predicción, solo conversión. Por ejemplo, si el usuario escribe "be", el IME puede devolver 北 como candidato, pero no 北京大学. Normalmente, los candidatos de predicción son demasiado restrictivos.
Las IME que no cumplen los criterios no son compatibles con la presentación de búsqueda de la misma manera que otros controles y no pueden aprovechar la integración de la UI y los candidatos de búsqueda. Las aplicaciones reciben consultas solo después de que el usuario terminó de redactar.
Cuando una aplicación que admite el contrato de búsqueda recibe una consulta, el evento de consulta contiene una matriz "queryTextAlternatives" que contiene todas las alternativas conocidas, clasificadas de la más relevante (probable) a menos relevante (poco probable).
Cuando se proporcionan alternativas, la aplicación debe tratar cada una como una consulta y devolver todos los resultados que coincidan con cualquiera de las alternativas. La aplicación debe comportarse como si el usuario hubiera emitido varias consultas al mismo tiempo, básicamente mediante la emisión de una consulta "o" al servicio al proporcionar los resultados. Para conocer las consideraciones sobre el rendimiento, las aplicaciones suelen limitar la coincidencia entre 5 y 20 de las alternativas más relevantes.
Instrucciones de diseño de IU
Todos los IME deben seguir las instrucciones de experiencia del usuario descritas en Diseño y programación de aplicaciones de Windows.
No utilizar sticky windows
Las ventanas de IME solo deben aparecer cuando sea necesario y no deberían estar visibles todo el tiempo. Cuando los usuarios no necesitan escribir, las ventanas del IME no deben mostrarse. La ventana del IME no debe ser una de pantalla completa. Las ventanas del IME no se deben superponer entre sí. Las ventanas deben diseñarse en un estilo de Windows y seguir el escalado de la UI.
Iconos de IME
Hay dos tipos de iconos de IME, iconos de personalización de marca e iconos de modo. Todos los iconos de IME solo deben diseñarse con colores negros y blancos. Los nuevos iconos de IME se toman prestados del aspecto glifo de los iconos de la bandeja del sistema. Este estilo se creó para que todos los idiomas puedan utilizarlo para complementar la apariencia familiar, además de que se diferencian entre sí.
El formato de archivo para los iconos de IME es ICO. Debe proporcionar los siguientes tamaños de icono.
- 16 x 16 píxeles
- 20 x 20 píxeles
- 24 x 24 píxeles
- 32 x 32 píxeles
- 40 x 40 píxeles
- 48 x 48 píxeles
Asegúrese de que los iconos de 32 bits con el canal alfa se proporcionan en todas las resoluciones.
Los iconos de marca del IME se definen mediante un cuadro blanco en el que se coloca un glyph tipográfico representado en un tipo de letra moderno. Cada equipo de idioma elige cada glyph de definición. El glyph es negro. La caja incluye un trazo exterior de 1 píxel en negro al 50 % de opacidad. Las versiones "nuevas" se definen mediante una esquina redondeada en la parte superior izquierda del cuadro.
Los iconos de modo del IME se definen mediante un glyph tipográfico blanco en una tipo de letra moderno que incluye un trazo exterior de 1 píxel en negro al 50 % de opacidad.
Icono | Descripción |
---|---|
Icono de marca del IME de ejemplo para el cangjie del chino tradicional. | |
Icono de marca del IME de ejemplo para el cangjie del chino tradicional. | |
Icono de modo de IME de ejemplo. |
Ventana propia
Para mostrar la UI de candidatos, un IME debe establecer su ventana propia, para que pueda mostrarse sobre la aplicación que se ejecute en ese momento. Use el método ITfContextView::GetWnd para recuperar la ventana a la que posee. Si GetWnd devuelve un error o NULLHWND, llame a la función GetFocus.
if (FAILED(pView->GetWnd(&parentWndHandle)) || (parentWndHandle == nullptr)) { parentWndHandle = GetFocus(); }
Interacción de ventana de candidatos de IME con superficies de cierre del elemento por cambio de foco
El modelo de cierre para ventanas emergentes se denomina "cierre del elemento por cambio de foco" porque es fácil que un usuario cierre estas ventanas. Para que los IME funcionen bien en el modelo de interacción de Windows, las ventanas del IME deben participar en el modelo de cierre del elemento por cambio de foco.
Para participar en el modelo de cierre del elemento por cambio de foco, el IME debe generar tres nuevos eventos de Windows mediante la función NotifyWinEvent o una función similar. Estos eventos nuevos son los siguientes:
- EVENT_OBJECT_IME_SHOW: genere este evento cuando el IME esté visible.
- EVENT_OBJECT_IME_HIDE: genere este evento cuando el IME esté oculto.
- EVENT_OBJECT_IME_CHANGE: genera este evento cuando el IME se mueve o cambia el tamaño.
Declaración de compatibilidad
Los IME declaran que son compatibles al registrar la categoría GUID_TFCAT_TIPCAP_IMMERSIVESUPPORT para su IME mediante ITfCategoryMgr::RegisterCategory.
Establezca el modo de IME predeterminado en activado
Se proporciona una mejor experiencia de usuario para los IME.
Compatibilidad con el ajuste de PPP para aplicaciones de escritorio
La compatibilidad mejorada con el ajuste de PPP permite consultar el nivel de reconocimiento de PPP declarado de cada proceso de escritorio para determinar si debe escalar la UI. En un escenario de varios monitores, Windows escala la UI de manera adecuada para diferentes configuraciones de PPP en cada monitor.
Dado que el IME se ejecuta en el contexto del proceso de cada aplicación, no debe declarar un nivel de reconocimiento de PPP para el IME. Esto garantiza que el IME se ejecute en el nivel de reconocimiento de PPP del proceso actual.
Para garantizar que todos los elementos de la UI del IME tienen paridad de escalado con los elementos de la UI del proceso en el que se está ejecutando, debe responder adecuadamente a diferentes valores de PPP.
Nota:
Para garantizar la paridad con las nuevas aplicaciones de escritorio, el IME debe admitir el reconocimiento de PPP del monitor, pero no debe declarar un nivel de reconocimiento por sí mismo. El sistema determina los requisitos de escalado adecuados en cada escenario.
Para más información sobre los requisitos de compatibilidad de ajuste de PPP para las aplicaciones de escritorio, consulte Valores altos de PPP.
Instalación del IME
Si compila el IME mediante Microsoft Visual Studio, cree una experiencia de instalación para el IME mediante un instalador de terceros, como InstallShield desde Flexera Software.
En los pasos siguientes se muestra cómo usar InstallShield para crear un proyecto de instalación para el archivo .dll de IME.
- Instalación de Visual Studio.
- Inicie Visual Studio.
- En el menú Archivo, seleccione Nuevo y haga clic en Proyecto. Se abre el cuadro de diálogo Nuevo proyecto.
- En el panel izquierdo, vaya a Plantillas > Otros tipos de proyecto > Configuración e implementación, haga clic en Habilitar InstallShield Limited Edition y, luego, en Aceptar. Siga las instrucciones de instalación.
- Reinicie Visual Studio.
- Abra del archivo de solución (.sln) del IME.
- En el Explorador de soluciones, haga clic con el botón derecho en la solución, elija Agregar y, luego, seleccione Nuevo proyecto. Se abre el cuadro de diálogo Agregar nuevo proyecto.
- En el control de vista de árbol izquierdo, vaya a Plantillas> Otros tipos de proyecto > InstallShield Limited Edition.
- En la ventana central, haga clic en Proyecto de InstallShield Limited Edition.
- En el cuadro de texto Nombre, escriba "SetupIME" y haga clic en Aceptar.
- En el cuadro de diálogo Asistente para proyectos, haga clic en Información de la aplicación.
- Rellene el nombre de la empresa y los demás campos.
- Haga clic en Archivos de aplicación.
- En el panel izquierdo, haga clic con el botón derecho en la carpeta [INSTALLDIR] y seleccione Nueva carpeta. Asigne un nombre a la carpeta "Plugins".
- Haga clic en Agregar archivos. Vaya al archivo .dll del IME y agréguelo a la carpeta Plugins. Repita este paso para el diccionario del IME.
- Haga clic con el botón derecho en el archivo .dll del IME y seleccione Propiedades. Se abrirá el cuadro de diálogo Propiedades.
- En el cuadro de diálogo Propiedades, haga clic en la pestaña Configuración de COM y NET .
- En Tipo de registro, seleccione Autoregistro y haga clic en Aceptar.
- Compile la solución. El archivo .dll del IME se compila e InstallShield crea un archivo setup.exe que permite a los usuarios instalar el IME en Windows.
Para crear su propia experiencia de instalación, llame al método ITfInputProcessorProfileMgr::RegisterProfile para registrar el IME durante la instalación. No escriba entradas del Registro directamente.
Si el IME debe utilizarse inmediatamente después de la instalación, llame a InstallLayoutOrTip para agregar el IME a los métodos de entrada habilitados para el usuario, con el siguiente formato para el parámetro psz:
<LangID 1>:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
Accesibilidad de IME
Implemente la siguiente convención para que los IME se ajusten a los requisitos de accesibilidad y para funcionar con Narrador. Para que las listas de candidatos sean accesibles, los IME deben seguir esta convención.
- La lista de candidatos debe tener un elemento UIA_AutomationIdPropertyId igual a "IME_Candidate_Window" para las listas de candidatos de conversión o "IME_Prediction_Window" para las listas de candidatos de predicción.
- Cuando la lista de candidatos aparece y desaparece, genera eventos de tipo UIA_MenuOpenedEventId y UIA_MenuClosedEventId, respectivamente
- Cuando cambia el candidato seleccionado actual, la lista de candidatos genera un elemento UIA_SelectionItem_ElementSelectedEventId. El elemento seleccionado debe tener una propiedad UIA_SelectionItemIsSelectedPropertyId igual a TRUE.
- El elemento UIA_NamePropertyId para cada elemento de la lista de candidatos debe ser el nombre del candidato. Como opción, puede proporcionar más información para eliminar la ambigüedad de los candidatos a través de UIA_HelpTextPropertyId.