Arquitectura de entrada de interoperabilidad entre formularios Windows Forms y WPFWindows Forms and WPF Interoperability Input Architecture

Interoperación entre el WPFWPF y Windows FormsWindows Forms requiere que ambas tecnologías tengan el procesamiento de entrada de teclado correspondiente.Interoperation between the WPFWPF and Windows FormsWindows Forms requires that both technologies have the appropriate keyboard input processing. Este tema describe cómo estas tecnologías implementan para habilitar la interoperabilidad sin contratiempos en aplicaciones híbridas de procesamiento de mensajes y teclado.This topic describes how these technologies implement keyboard and message processing to enable smooth interoperation in hybrid applications.

Este tema contiene las siguientes subsecciones:This topic contains the following subsections:

  • Formularios no modales y cuadros de diálogoModeless Forms and Dialog Boxes

  • Procesamiento de mensajes y teclado de WindowsFormsHostWindowsFormsHost Keyboard and Message Processing

  • Procesamiento de mensajes y teclado de ElementHostElementHost Keyboard and Message Processing

Formularios no modales y cuadros de diálogoModeless Forms and Dialog Boxes

Llame a la EnableWindowsFormsInterop método en el WindowsFormsHost elemento para abrir un cuadro de formulario o cuadro de diálogo no modal de una WPFWPF-aplicación basada en.Call the EnableWindowsFormsInterop method on the WindowsFormsHost element to open a modeless form or dialog box from a WPFWPF-based application.

Llame a la EnableModelessKeyboardInterop método en el ElementHost control para abrir un no modal WPFWPF página en un Windows FormsWindows Forms-aplicación basada en.Call the EnableModelessKeyboardInterop method on the ElementHost control to open a modeless WPFWPF page in a Windows FormsWindows Forms-based application.

Procesamiento de mensajes y teclado de WindowsFormsHostWindowsFormsHost Keyboard and Message Processing

Cuando se hospeda en un WPFWPF-aplicación, basada en Windows FormsWindows Forms teclado y el mensaje de procesamiento consta de lo siguiente:When hosted by a WPFWPF-based application, Windows FormsWindows Forms keyboard and message processing consists of the following:

Las secciones siguientes describen estas partes del proceso con más detalle.The following sections describe these parts of the process in more detail.

Al adquirir los mensajes desde el bucle de mensajes WPFAcquiring Messages from the WPF Message Loop

El ComponentDispatcher clase implementa el Administrador de bucle de mensajes de WPFWPF.The ComponentDispatcher class implements the message loop manager for WPFWPF. El ComponentDispatcher clase proporciona enlaces para permitir que los clientes externos para filtrar los mensajes antes de WPFWPF los procesa.The ComponentDispatcher class provides hooks to enable external clients to filter messages before WPFWPF processes them.

Los identificadores de implementación de la interoperabilidad del ComponentDispatcher.ThreadFilterMessage eventos, lo que permite Windows FormsWindows Forms controles para procesar los mensajes antes de WPFWPF controles.The interoperation implementation handles the ComponentDispatcher.ThreadFilterMessage event, which enables Windows FormsWindows Forms controls to process messages before WPFWPF controls.

Bucle de mensajes de suplente Windows FormsSurrogate Windows Forms Message Loop

De forma predeterminada, el System.Windows.Forms.Application clase contiene el bucle de mensajes principal para Windows FormsWindows Forms aplicaciones.By default, the System.Windows.Forms.Application class contains the primary message loop for Windows FormsWindows Forms applications. Durante la interoperabilidad, el Windows FormsWindows Forms mensaje bucle no procesa mensajes.During interoperation, the Windows FormsWindows Forms message loop does not process messages. Por lo tanto, esta lógica se debe reproducir.Therefore, this logic must be reproduced. El controlador para el ComponentDispatcher.ThreadFilterMessage eventos realizan los pasos siguientes:The handler for the ComponentDispatcher.ThreadFilterMessage event performs the following steps:

  1. Filtra el mensaje mediante la IMessageFilter interfaz.Filters the message using the IMessageFilter interface.

  2. Las llamadas del Control.PreProcessMessage método.Calls the Control.PreProcessMessage method.

  3. Traduce y lo envía el mensaje, si es necesario.Translates and dispatches the message, if it is required.

  4. Pasa el mensaje al control host, si ningún otro control procesa el mensaje.Passes the message to the hosting control, if no other controls process the message.

Implementación de IKeyboardInputSinkIKeyboardInputSink Implementation

El bucle de mensajes suplente controla la administración de teclado.The surrogate message loop handles keyboard management. Por lo tanto, el IKeyboardInputSink.TabInto es el único método IKeyboardInputSink miembro que requiere una implementación en el WindowsFormsHost clase.Therefore, the IKeyboardInputSink.TabInto method is the only IKeyboardInputSink member that requires an implementation in the WindowsFormsHost class.

De forma predeterminada, el HwndHost clase devuelve false para su IKeyboardInputSink.TabInto implementación.By default, the HwndHost class returns false for its IKeyboardInputSink.TabInto implementation. Esto evita la tabulación desde un WPFWPF el control a un Windows FormsWindows Forms control.This prevents tabbing from a WPFWPF control to a Windows FormsWindows Forms control.

El WindowsFormsHost implementación de la IKeyboardInputSink.TabInto método lleva a cabo los pasos siguientes:The WindowsFormsHost implementation of the IKeyboardInputSink.TabInto method performs the following steps:

  1. Busca el primer o último Windows FormsWindows Forms control que contiene el WindowsFormsHost control y que puede recibir el foco.Finds the first or last Windows FormsWindows Forms control that is contained by the WindowsFormsHost control and that can receive focus. La opción de control depende de la información de recorrido.The control choice depends on traversal information.

  2. Establece el foco al control y devuelve true.Sets focus to the control and returns true.

  3. Si ningún control puede recibir el foco, devuelve false.If no control can receive focus, returns false.

Registro de WindowsFormsHostWindowsFormsHost Registration

Cuando la ventana se controlan a un WindowsFormsHost se crea el control, el WindowsFormsHost control llama a un método estático interno que registra su presencia para el bucle de mensajes.When the window handle to a WindowsFormsHost control is created, the WindowsFormsHost control calls an internal static method that registers its presence for the message loop.

Durante el registro, el WindowsFormsHost control examina el bucle de mensajes.During registration, the WindowsFormsHost control examines the message loop. Si no se ha iniciado el bucle de mensajes, el ComponentDispatcher.ThreadFilterMessage se crea el controlador de eventos.If the message loop has not been started, the ComponentDispatcher.ThreadFilterMessage event handler is created. El bucle de mensajes se considera que se ejecuta cuando el ComponentDispatcher.ThreadFilterMessage está asociado el controlador de eventos.The message loop is considered to be running when the ComponentDispatcher.ThreadFilterMessage event handler is attached.

Cuando se destruye el identificador de ventana, el WindowsFormsHost control quita a sí mismo desde el registro.When the window handle is destroyed, the WindowsFormsHost control removes itself from registration.

Procesamiento de mensajes y teclado de ElementHostElementHost Keyboard and Message Processing

Cuando se hospeda en un Windows FormsWindows Forms aplicación, WPFWPF teclado y el mensaje de procesamiento consta de lo siguiente:When hosted by a Windows FormsWindows Forms application, WPFWPF keyboard and message processing consists of the following:

Las siguientes secciones describen estas partes con más detalle.The following sections describe these parts in more detail.

Implementaciones de interfazInterface Implementations

En Windows FormsWindows Forms, se enrutan los mensajes del teclado para el identificador de ventana del control que tiene el foco.In Windows FormsWindows Forms, keyboard messages are routed to the window handle of the control that has focus. En el ElementHost (control), estos mensajes se enrutan al elemento hospedado.In the ElementHost control, these messages are routed to the hosted element. Para lograr esto, el ElementHost control proporciona un HwndSource instancia.To accomplish this, the ElementHost control provides an HwndSource instance. Si el ElementHost control tiene el foco, el HwndSource instancia enruta la mayoría de teclado de entrada para que se pueden ser procesado por el WPFWPF InputManager clase.If the ElementHost control has focus, the HwndSource instance routes most keyboard input so that it can be processed by the WPFWPF InputManager class.

El HwndSource la clase implementa la IKeyboardInputSink y IKeyboardInputSite interfaces.The HwndSource class implements the IKeyboardInputSink and IKeyboardInputSite interfaces.

Interoperabilidad con teclado se basa en la implementación de la OnNoMoreTabStops método clave del controlador de PESTAÑA y flecha clave de entrada que se mueve el foco fuera de los elementos hospedados.Keyboard interoperation relies on implementing the OnNoMoreTabStops method to handle TAB key and arrow key input that moves focus out of hosted elements.

Tabulación y las teclas de direcciónTabbing and Arrow Keys

El Windows FormsWindows Forms lógica de selección se asigna a la IKeyboardInputSink.TabInto y OnNoMoreTabStops métodos para implementar la ficha y la flecha de navegación de clave.The Windows FormsWindows Forms selection logic is mapped to the IKeyboardInputSink.TabInto and OnNoMoreTabStops methods to implement TAB and arrow key navigation. Reemplazar el Select método lleva a cabo esta asignación.Overriding the Select method accomplishes this mapping.

Teclas de comando y claves del cuadro de diálogoCommand Keys and Dialog Box Keys

Para dar WPFWPF la primera oportunidad para procesar las teclas de comando y las claves del cuadro de diálogo, Windows FormsWindows Forms preprocesamiento del comando se conecta a la TranslateAccelerator método.To give WPFWPF the first opportunity to process command keys and dialog keys, Windows FormsWindows Forms command preprocessing is connected to the TranslateAccelerator method. Reemplazar el Control.ProcessCmdKey método conecta las dos tecnologías.Overriding the Control.ProcessCmdKey method connects the two technologies.

Con el TranslateAccelerator método, los elementos hospedados pueden controlar cualquier mensaje de tecla, como WM_KEYUP, WM_KEYDOWN, WM_SYSKEYDOWN o WM_SYSKEYUP, incluidas las teclas de comando, como teclas de flecha, ESC, ENTRAR y PESTAÑA.With the TranslateAccelerator method, the hosted elements can handle any key message, such as WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP, including command keys, such as TAB, ENTER, ESC, and arrow keys. Si no se controla un mensaje de tecla, se envía a la Windows FormsWindows Forms jerarquía antecesor para el control.If a key message is not handled, it is sent up the Windows FormsWindows Forms ancestor hierarchy for handling.

Procesamiento de aceleradoresAccelerator Processing

Para procesar correctamente, los aceleradores Windows FormsWindows Forms procesamiento acelerador debe estar conectado a la WPFWPF AccessKeyManager clase.To process accelerators correctly, Windows FormsWindows Forms accelerator processing must be connected to the WPFWPF AccessKeyManager class. Además, todos los mensajes WM_CHAR se deben enrutar correctamente a los elementos hospedados.Additionally, all WM_CHAR messages must be correctly routed to hosted elements.

Dado que el valor predeterminado HwndSource implementación de la TranslateChar devuelve del método false, mensajes WM_CHAR se procesan mediante la lógica siguiente:Because the default HwndSource implementation of the TranslateChar method returns false, WM_CHAR messages are processed using the following logic:

  • El Control.IsInputChar método se invalida para asegurarse de que todos los mensajes WM_CHAR se reenvíen a los elementos hospedados.The Control.IsInputChar method is overridden to ensure that all WM_CHAR messages are forwarded to hosted elements.

  • Si se presiona la tecla ALT, el mensaje es WM_SYSCHAR.If the ALT key is pressed, the message is WM_SYSCHAR. Windows FormsWindows Forms no procesa previamente este mensaje a través de la IsInputChar método.does not preprocess this message through the IsInputChar method. Por lo tanto, el ProcessMnemonic método se invalida para consultar el WPFWPF AccessKeyManager un acelerador registrado.Therefore, the ProcessMnemonic method is overridden to query the WPFWPF AccessKeyManager for a registered accelerator. Si se encuentra un acelerador registrado, AccessKeyManager lo procesa.If a registered accelerator is found, AccessKeyManager processes it.

  • Si no presiona la tecla ALT, el WPFWPF InputManager clase procesa la entrada no controlada.If the ALT key is not pressed, the WPFWPF InputManager class processes the unhandled input. Si la entrada es un acelerador, el AccessKeyManager lo procesa.If the input is an accelerator, the AccessKeyManager processes it. El PostProcessInput se controla el evento para el mensaje WM_CHAR que no se han procesado.The PostProcessInput event is handled for WM_CHAR messages that were not processed.

Cuando el usuario presiona la tecla ALT, se muestran indicaciones visuales del acelerador en todo el formulario.When the user presses the ALT key, accelerator visual cues are shown on the whole form. Para admitir este comportamiento, todos los ElementHost controles en el formulario activo reciben mensajes WM_SYSKEYDOWN, con independencia de qué control tiene el foco.To support this behavior, all ElementHost controls on the active form receive WM_SYSKEYDOWN messages, regardless of which control has focus.

Los mensajes se envían únicamente a ElementHost controles en el formulario activo.Messages are sent only to ElementHost controls in the active form.

Vea tambiénSee also