Acerca del método de entrada

Primero, sobre el IME de lenguaje mixto de Windows 95

En Windows 95, el IME es una biblioteca de vínculos dinámicos (DLL). A diferencia de la versión del Lejano Oriente de Windows 3.1, cada IME en ejecución equivale a una distribución de teclado en varios idiomas. En comparación con el IME de Windows 3.1, el IME de lenguaje mixto de Windows 95 proporciona las siguientes mejoras:

●El tiempo de ejecución es equivalente a un componente del entorno de lenguaje mixto.

●Proporcione múltiples contextos de entrada para cada tarea de la aplicación.

Proporciona un IME activo para cada hilo de la aplicación.

●Proporciona información a la aplicación a través del bucle de mensajes de la aplicación (el orden de los mensajes no se puede cambiar).

● Proporciona un sólido soporte para aplicaciones no compatibles con IME y algunas aplicaciones compatibles con IME.

Para obtener todas las funciones mejoradas, las aplicaciones deben admitir I/F de aplicación IME de Windows 95

Este documento describe la interfaz de aplicación de la arquitectura IME de Windows 95.

1 y la estructura de IME

Windows 95 IME debe proporcionar dos componentes: interfaz de conversión de IME e interfaz de usuario de IME. La interfaz de conversión de IME es proporcionada por un conjunto de funciones de exportación del módulo IME, que son llamadas por IMM (Administrador de métodos de entrada).

La interfaz de usuario de IME la proporciona un conjunto de ventanas que reciben mensajes y proporcionan la interfaz de usuario de IME.

2.Aplicaciones compatibles con IME (aplicaciones que admiten IME)

Las aplicaciones son de los siguientes tipos:

●Aplicaciones que no admiten IME: esta aplicación El programa no controla el IME; sin embargo, si la aplicación acepta caracteres DBCS, el usuario puede ingresar caracteres DBCS en la aplicación a través del IME.

● Algunas aplicaciones de soporte de IME: Esta aplicación solo controla diferentes contextos de IME, como abrir y cerrar IME, escribir ventanas, etc. , pero no se volverá a mostrar ninguna interfaz de usuario IME.

● Aplicación de soporte completo de IME: La aplicación es responsable de administrar cualquier información que se muestra en la aplicación a través de IME.

En Windows 95, las aplicaciones sin soporte IME tienen una ventana IME predeterminada y un contexto de entrada predeterminado.

Algunas aplicaciones de soporte de IME crean sus propias ventanas de IME utilizando clases de IME predefinidas, que pueden o no administrar su propio contexto de entrada.

La compatibilidad total con IME permite que la aplicación administre el contexto de entrada y muestre cualquier información requerida proporcionada por el contexto de entrada sin usar una ventana de IME.

En segundo lugar, la interfaz de usuario IME

La interfaz de usuario IME incluye la ventana IME, la ventana de la interfaz de usuario (UI) y los componentes de la ventana UI.

1. Función

La clase IME es una clase de ventana global predefinida que implementa la parte de la interfaz de usuario del IME. La clase "IME" comparte muchas características con las clases de ventana de control * * * públicas predefinidas. Al igual que los controles estáticos, las instancias de ventana IME se crean mediante la función CreateWindowEx y la ventana de clase IME en sí no responde a la entrada del usuario. En cambio, reciben diferentes tipos de mensajes de control para implementar todas las interfaces de usuario IME. Las aplicaciones pueden usar la clase IME para crear su propia ventana IME o pueden usar la función ImmGetDefaultIMEWnd para obtener la ventana IME predeterminada. Las aplicaciones que crean su propia ventana IME o usan la ventana IME predeterminada se denominan aplicaciones compatibles con IME y tienen las siguientes ventajas (en comparación con las aplicaciones correspondientes de Windows 3.1):

Incluye una ventana de lista de palabras candidatas (ventana candidata), Cada aplicación puede tener su propia instancia de la ventana de la interfaz de usuario, de modo que el usuario pueda detenerse y cambiar a otra aplicación a mitad de cualquier proceso de entrada. En la versión japonesa de Windows 3.1, los usuarios deben abandonar el proceso de entrada actual al cambiar a otra aplicación.

Debido a que la ventana de la interfaz de usuario de IME incluye el identificador de la ventana de la aplicación, la ventana de la interfaz de usuario de IME puede proporcionar un comportamiento predeterminado para la aplicación.

Por ejemplo, la ventana de la interfaz de usuario de IME se mueve automáticamente cuando se mueve la aplicación, sigue automáticamente la posición del cursor en la ventana, marca el modo de cada aplicación, etc.

Incluso si el sistema solo proporciona una clase IME, todavía hay dos tipos de ventanas IME. Un tipo es una ventana IME creada por el sistema para aplicaciones sin soporte IME, y la función DefWindowProc maneja mensajes para la ventana. La interfaz de usuario IME de la función DefWindowProc es compartida por todas las ventanas de este hilo que no son compatibles con IME. En la documentación, esta ventana se denomina ventana IME predeterminada. Otro tipo es una ventana IME creada por una aplicación compatible con IME. En este documento, una ventana IME creada por una aplicación habilitada para IME se denomina ventana IME de aplicación.

2. Ventanas IME predeterminadas y de aplicación

Cuando se inicializa el hilo, el sistema crea la ventana IME predeterminada, es decir, el hilo obtiene automáticamente la ventana IME predeterminada. La ventana IME predeterminada proporciona una interfaz de usuario IME para aplicaciones sin soporte IME. Cuando un IME o IMM genera un mensaje IME (WM_IME_*), una aplicación sin soporte IME pasa el mensaje a la función DefWindowProc, que envía el mensaje requerido a la ventana IME predeterminada que proporciona a la aplicación la interfaz de usuario IME predeterminada. Las aplicaciones compatibles con IME también pueden usar la ventana IME predeterminada cuando no se reciben mensajes del IME y pueden usar su propia ventana IME si es necesario.

3.Nivel IME

La clase IME es una clase de ventana predefinida en la versión Lejano Oriente de Windows 95, al igual que Edit es una clase de ventana predefinida. Las clases IME predefinidas implementan todas las interfaces de usuario de IME y manejan todos los mensajes del IME y las aplicaciones que contienen funciones IMM. Las aplicaciones utilizan clases IME para crear sus propias ventanas IME. El nivel de IME del sistema no puede ser reemplazado por ningún IME.

El procedimiento de ventana interactúa con la clase IME a través del mensaje WM_IME_selection. El mensaje contiene la distribución del teclado del IME recién seleccionado. La clase IME utiliza la distribución del teclado para encontrar el nombre de clase definido por cada IME. Usando el nombre de la clase, la clase IME crea una ventana de interfaz de usuario de IME para el IME actualmente activo.

4.Clase UI de IME

Cada IME debe registrar su propia clase de interfaz de usuario (UI) en el sistema, que proporciona funciones relacionadas con IME. Cuando un IME se adjunta a un proceso, el IME registra sus propias clases de UI. Es decir, cuando la función DLLEntry se llama función DLL_PROCESS_ATTACH, el IME debe especificar el nombre de la clase UI al llamar a la función ImeInquire. Las clases de UI deben registrarse en el estilo de ventana CS_IME para que todas las aplicaciones puedan usar las clases de UI.

Los nombres de clases de UI (incluido el terminador nulo) pueden usar 16 caracteres TCHAR, que pueden extenderse a futuras versiones de Windows.

Al registrar una clase UI, debe especificar 8 bytes de datos adicionales de ventana (es decir, establecer el valor del miembro cbWndExtra de la clase WNDCLASSEX en 2*sizeof(LONG)), y el sistema utilizará la ventana de datos adicionales.

IME puede registrar cualquier clase y crear cualquier ventana al realizar tareas para la aplicación.

El siguiente ejemplo muestra cómo registrar la clase de ventana IME:

BOOL WINAPI DLLEntry(h instancia hinst dll, DWORD dwFunction, LPVOID lpNot)

{

Cambiar (dwFunction)

{

Caso DLL_PROCESS_ATTACH:

hInst = hInstDLL

Estilo WC = CS. _ mi bandera de clase | CS_IME;

WC .lpfnwndproc = MyUIServerWndProc;

WC . ;

wc.hInstance = hInst

wc.hCursor = LoadCursor(NULL, IDC _ ARROW);

wc.hIcon = NULL

WC . lpszmenuname = (LPSTR) NULL;

WC lpsz nombre de clase =(LPSTR)szui nombre de clase;

wc.hbrBackground = NULL

if (!register class((LPWNDCLASS)& wc))

Devuelve FALSE

WC . MyCompStringWndProc;

WC cbclsextra = 0;

wc.cbWndExtra = cbMyWndExtra

wc.hInstance = hInst

wc.hCursor =. LoadCursor(NULL, IDC_ARROW);

wc.hIcon = NULL

WC lpszmenuname = (LPSTR)NULL;

WC .lpsz nombre de clase =(LPSTR )szuicompstringnombre de clase;

wc.hbrBackground = NULL

Si (! registrar clase((LPWNDCLASS)& wc))

Devolver FALSO

Break;

Caso DLL_PROCESS_DETACH:

UnregisterClass(szUIClassName, hInst

desregistrar clase(szuicompstringclass name, hInst

Break

}

Devuelve TRUE

}

5. Ventana de interfaz de usuario

La ventana IME correspondiente a la clase IME es creada por la aplicación o el sistema. Cuando se crea una ventana de IME, la ventana de interfaz de usuario proporcionada por el propio IME se crea y es propiedad de la ventana de IME. Cada ventana de la interfaz de usuario tiene un contexto de entrada actual. Cuando una ventana de la interfaz de usuario recibe un mensaje IME (WM_IME_*), puede encontrar el contexto de entrada llamando a la función GetWindowLong y especificando el valor del índice IMMGWL_IMC. La ventana de la interfaz de usuario puede manejar mensajes según el contexto de entrada, excepto en respuesta al mensaje WM_CREATE, que puede encontrar el contexto de entrada en cualquier momento.

//Este artículo es una transferencia de la investigación de C++Builder-/article.asp? i = 590 & ampd=b216b8

El IME no puede cambiar los datos adicionales de la ventana UI. Si una instancia de una ventana de UI requiere datos de ventana adicionales, puede llamar a las funciones SetWindowLong y GetWindowLong con el valor del parámetro IMMGWL_PRIVATE. El valor del parámetro IMMGWL_PRIVATE proporciona a la instancia de la ventana de la interfaz de usuario la capacidad de acceder a valores LARGO en los datos adjuntos. Si necesita datos adicionales mayores que el valor LONG, puede guardar el identificador del bloque de memoria en el campo IMMGWL_PRIVATE.

El procedimiento de la ventana UI puede usar la función DefWindowProc, pero la ventana UI no puede pasar mensajes IME a la función DefWindowProc. Incluso si el mensaje IME no se procesa, la ventana de la interfaz de usuario no puede pasar el mensaje a la función DefWindowProc.

LRESULT UIWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

HIMC hIMC;

HGLOBAL hMyExtra

Cambiar(mensaje){

Caso WM_CREATE:

//Asigna un bloque de memoria para la instancia de la ventana.

hMyExtra = GlobalAlloc(GHND, tamaño _ de _ mi extra

if (!hMyExtra)

mi error(); p>//Establece el identificador de memoria en IMMGWL_PRIVATE

SetWindowLong(hWnd, IMMGWL_PRIVATE, (LONG)hmy extra);

.

.

.

Pausa;

Caso WM_IME_xxxx:

//Obtener IMC

hIMC = GetWindowLong(hWnd, IMM gwl_IMC);

//Obtiene el identificador de memoria de la instancia de la ventana.

hMyExtra = GetWindowLong(hWnd, IMM gwl _ PRIVATE

lpMyExtra = bloqueo global(hmy extra);

.

.

desbloqueo global(hmy extra);

Descanso;

.

.

.

Caso WM_DESTROY:

//Obtiene el identificador de memoria de la instancia de la ventana.

hMyExtra = GetWindowLong(hWnd, IMM gwl _ PRIVATE);

//Libera el bloque de memoria para la instancia de la ventana.

global free(hmy extra);

Break;

Valor predeterminado:

Devolver DefWindowProc(hWnd, msg, wParam, lParam );

}

}

La ventana UI debe realizar operaciones dentro del contexto de entrada seleccionado actualmente. Cuando se activa la ventana, la ventana de la interfaz de usuario recibe mensajes que proporcionan el contexto de entrada actual y luego opera en el contexto de entrada seleccionado actualmente. El contexto de entrada debe incluir toda la información necesaria para que la ventana de la interfaz de usuario muestre la ventana de escritura, la ventana de estado, etc.

La ventana de la interfaz de usuario requiere un contexto de entrada, pero no necesita actualizar el contexto de entrada en sí. Cuando la ventana de la interfaz de usuario necesita actualizar el contexto de entrada, se debe llamar a la función IMM, porque el contexto de entrada lo administra la función IMM. Cuando se actualiza el contexto de entrada, el IMM y el IME reciben mensajes de notificación.

Por ejemplo, a veces la ventana de la interfaz de usuario necesita cambiar la forma en que se convierte el contexto de entrada cuando se hace clic con el mouse. Para configurar el modo de conversión, la ventana de la interfaz de usuario llama a la función ImmSetConversionMode, que genera un mensaje de notificación para NotifyIME y envía un mensaje WM_IME_NOTIFY a la ventana de la interfaz de usuario. Si la ventana de la interfaz de usuario cambia la visualización del modo de conversión, la ventana de la interfaz de usuario esperará a que se procese el mensaje WM_IME_NOTIFY.

6. Componentes de la ventana de la UI

La ventana de la UI puede registrar y mostrar la ventana de escritura y la ventana de estado de acuerdo con el contexto de entrada. El estilo de la ventana de la clase de componente de la ventana de la UI debe. incluir CS_IME. La instancia de ventana de la ventana de la interfaz de usuario recibe información como la cadena de escritura, la fuente, la posición, etc. Desde el contexto de entrada actual. Cuando la ventana de la aplicación gana foco, el sistema obtiene su propio contexto de entrada y pasa el contexto de entrada actual a la ventana de la interfaz de usuario. El sistema envía el mensaje WM_IME_SETCONTEXT y el identificador del contexto de entrada a la aplicación, y la aplicación pasa el mensaje a la ventana de la interfaz de usuario. Si se actualiza el contexto de entrada actual, la ventana de la interfaz de usuario debería volver a dibujar la ventana de escritura. Siempre que cambia el contexto de entrada, la ventana de la interfaz de usuario debe mostrar la ventana de escritura correcta para garantizar el estado del IME.

Las ventanas de la interfaz de usuario pueden crear estados de visualización, escribiendo subventanas o ventanas emergentes con cadenas o listas de palabras candidatas. Estas ventanas deben estar adjuntas a la ventana de la interfaz de usuario y deben crearse como ventanas deshabilitadas. Cualquier ventana creada por el IME no debería tener foco.

En tercer lugar, ingrese el contexto

1. Contexto de entrada predeterminado

De forma predeterminada, el sistema proporciona un contexto de entrada para cada hilo, que está compuesto por todo el IME. No se admite el uso compartido de ventanas para este hilo.

2. Interacción entre el contexto de entrada y la ventana

La ventana de la aplicación puede usar el identificador de ventana para interactuar con el contexto de entrada para mantener cualquier estado de IME, incluidas las cadenas escritas intermedias. Una vez que la aplicación hace que el contexto de entrada interactúe con el identificador de la ventana, el sistema selecciona automáticamente el contexto de entrada cada vez que se activa la ventana. Al utilizar esta característica, las aplicaciones pueden completar fácilmente el complejo proceso de conmutación necesario en Windows 3.1.

3. Uso del contexto de entrada

Cuando una aplicación o sistema crea un nuevo contexto de entrada, el sistema prepara el nuevo contexto de entrada, que ya incluye IMCC. Los componentes de este IMC constan de hCompStr, hCandInfo, hGuideLine, hPrivate y hMsgBuf. Básicamente, IME no necesita crear el contexto de entrada y los componentes del contexto de entrada, pero el IME puede cambiar su tamaño y encontrar punteros a los componentes bloqueándolos.

(1) Acceder a HIMC

Para acceder al contexto de entrada, el IME debe llamar a la función ImmLockIMC para encontrar el puntero al contexto de entrada. La función ImmLockIMC aumenta el recuento de bloqueos imm del IMC y la función ImmUnlockIMC lo disminuye.

(2) Ingrese a HIMCC

Para acceder a los componentes en el contexto de entrada, IME debe llamar a la función IMLockIMCC para obtener el puntero IMCC. La función IMLockIMCC aumenta el recuento de bloqueos IMCC y la función ImmUnlockIMCC lo disminuye. La función ImmReSizeIMCC puede modificar el tamaño de IMCC para especificar un nuevo tamaño.

En algunos casos, es posible que el IME necesite crear un componente del propio INPUTCONTEXT. En este caso, ImmCreateIMCC puede llamar a la función IMCC para obtener el identificador de IMCC, que puede ser miembro de la estructura InputContext (hCompStr, hCandInfo, hGuideLine, hPrivate o hMsgBuf).

ImmDestroyIMCC borra el componente de contexto de entrada.

(3) Cómo utilizar el contexto de entrada

El siguiente ejemplo muestra cómo utilizar el contexto de entrada.

LPINPUTCONTEXT lpIMC

LPCOMOSITIONSTRING lpCompStr

HIMCC hMyCompStr

if (hIMC) { //No es un contexto vacío.

lpIMC = ImmLockIMC(hIMC);

If (!lpIMC) {

MyError("No se puede bloquear hIMC ");

Devuelve FALSO

}

//Utiliza lpIMC->hCompStr.

lpCompStr =(LPCOMPOSITIONSTRING)ImmLockIMCC(lpi MC->hCompStr);

//Accede a lpCompStr.

ImmUnlockIMCC(lpIMC->hCompStr);

//Ajusta el tamaño de lpIMC->hCompStr.

If (!(hMyCompStr = ImmReSizeIMCC(lpIMC-> hCompStr, dwNewSize)) {

MyError("No se puede cambiar el tamaño de hCompStr");

ImmUnlockIMC( hIMC);

Devuelve FALSO

}

lpIMC-& gt;hCompStr = hMyCompStr

ImmUnlockIMC(hIMC

}