Interoperabilidad de WPF y Win32WPF and Win32 Interoperation

En este tema se proporciona información general sobre cómo interoperar código de WPFWPF y Win32Win32.This topic provides an overview of how to interoperate WPFWPF and Win32Win32 code. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona un entorno rico para crear aplicaciones.provides a rich environment for creating applications. Pero, si ha hecho una inversión sustancial en código de Win32Win32, podría resultar más efectivo reutilizar parte de ese código.However, when you have a substantial investment in Win32Win32 code, it might be more effective to reuse some of that code.

Conceptos básicos de interoperación de WPF y Win32WPF and Win32 Interoperation Basics

Hay dos técnicas básicas de la interoperación entre el código de WPFWPF y Win32Win32.There are two basic techniques for interoperation between WPFWPF and Win32Win32 code.

  • Hospedar contenido de WPFWPF en una ventana de Win32Win32.Host WPFWPF content in a Win32Win32 window. Con esta técnica puede usar las capacidades gráficas avanzadas de WPFWPF en el marco de una ventana y aplicación estándar de Win32Win32.With this technique, you can use the advanced graphics capabilities of WPFWPF within the framework of a standard Win32Win32 window and application.

  • Hospedar una ventana de Win32Win32 en un contenido de WPFWPF.Host a Win32Win32 window in WPFWPF content. Con esta técnica puede usar un control personalizado de Win32Win32 existente en el contexto de otro contenido de WPFWPF y pasar datos a través de los límites.With this technique, you can use an existing custom Win32Win32 control in the context of other WPFWPF content, and pass data across the boundaries.

Todas estas técnicas se presentan conceptualmente en este tema.Each of these techniques is conceptually introduced in this topic. Para ver una ilustración más orientada al código de hospedaje WPFWPF en Win32Win32, consulte Tutorial: Hospedar contenido WPF en Win32.For a more code-oriented illustration of hosting WPFWPF in Win32Win32, see Walkthrough: Hosting WPF Content in Win32. Para ver una ilustración más orientada al código de hospedaje Win32Win32 en WPFWPF, consulte Tutorial: Hospedar un Control de Win32 en WPF.For a more code-oriented illustration of hosting Win32Win32 in WPFWPF, see Walkthrough: Hosting a Win32 Control in WPF.

Proyectos de interoperación de WPFWPF Interoperation Projects

Las APIAPIs de WPFWPF son código administrado, pero la mayoría de los programas existentes de Win32Win32 están escritos en C++C++ no administrado.WPFWPF APIAPIs are managed code, but most existing Win32Win32 programs are written in unmanaged C++C++. No puede llamar a las APIAPIs de WPFWPF desde un auténtico programa no administrado,You cannot call WPFWPF APIAPIs from a true unmanaged program. pero puede usar la opción /clr con el compilador de Microsoft Visual C++Microsoft Visual C++ para crear un programa mixto (administrado-no administrado), en el que puede combinar perfectamente llamadas de APIAPI administradas y no administradas.However, by using the /clr option with the Microsoft Visual C++Microsoft Visual C++ compiler, you can create a mixed managed-unmanaged program where you can seamlessly mix managed and unmanaged APIAPI calls.

Una desventaja a nivel de proyecto es que no puede compilar archivos Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) en un proyecto de C++C++.One project-level complication is that you cannot compile Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) files into a C++C++ project. Existen varias técnicas de división de proyectos para compensarlo.There are several project division techniques to compensate for this.

  • Cree una DLL de C# que contiene todos sus XAMLXAML páginas como un ensamblado compilado y, a continuación, tiene su C++C++ ejecutable que incluyen Archivo DLLDLL como referencia.Create a C# DLL that contains all your XAMLXAML pages as a compiled assembly, and then have your C++C++ executable include that Archivo DLLDLL as a reference.

  • Crear C# ejecutable para el WPFWPF de contenido y lo hacen referencia a un C++C++ Archivo DLLDLL que contiene el Win32Win32 contenido.Create a C# executable for the WPFWPF content, and have it reference a C++C++ Archivo DLLDLL that contains the Win32Win32 content.

  • Use Load cargará todos XAMLXAML en tiempo de ejecución, en lugar de compilar su XAMLXAML.Use Load to load any XAMLXAML at run time, instead of compiling your XAMLXAML.

  • No use XAMLXAML en absoluto y escribir todo su WPFWPF en código, compilar el árbol de elementos de Application.Do not use XAMLXAML at all, and write all your WPFWPF in code, building up the element tree from Application.

Use el método que se adapte mejor a sus necesidades.Use whatever approach works best for you.

Nota

Si no ha usado C++/CLIC++/CLI antes, observará algunas palabras clave "nuevas", como gcnew y nullptr, en los ejemplos de código de interoperación.If you have not used C++/CLIC++/CLI before, you might notice some "new" keywords such as gcnew and nullptr in the interoperation code examples. Estas palabras clave reemplazan la anterior sintaxis de doble subrayado (__gc) y proporcionan una sintaxis más natural para el código administrado en C++C++.These keywords supersede the older double-underscore syntax (__gc) and provide a more natural syntax for managed code in C++C++. Para obtener más información sobre las características administradas de C++/CLIC++/CLI, consulte Extensiones de componentes para plataformas de tiempo de ejecución y Hello, C++/CLI (Hola, C++/CLI).To learn more about the C++/CLIC++/CLI managed features, see Component Extensions for Runtime Platforms and Hello, C++/CLI.

Cómo WPF usa los HWNDHow WPF Uses Hwnds

Para aprovechar al máximo la "interoperación de HWND" de WPFWPF, debe comprender cómo WPFWPF usa los HWND.To make the most of WPFWPF "HWND interop", you need to understand how WPFWPF uses HWNDs. En ningún HWND se puede mezclar la representación de WPFWPF con la representación de DirectXDirectX o la representación de GDIGDI / GDI+GDI+.For any HWND, you cannot mix WPFWPF rendering with DirectXDirectX rendering or GDIGDI / GDI+GDI+ rendering. Esto tiene varias implicaciones.This has a number of implications. En primer lugar, para poder mezclar estos modelos de representación, debe crear una solución de interoperación y usar segmentos de interoperación designados para cada modelo de representación que quiera usar.Primarily, in order to mix these rendering models at all, you must create an interoperation solution, and use designated segments of interoperation for each rendering model that you choose to use. Además, el comportamiento de representación crea una restricción de "espacio aéreo" de lo que puede llevar a cabo su solución de interoperación.Also, the rendering behavior creates an "airspace" restriction for what your interoperation solution can accomplish. El concepto "espacio aéreo" se describe más detalladamente en el tema Información general sobre áreas de la tecnología.The "airspace" concept is explained in greater detail in the topic Technology Regions Overview.

Todos los elementos de WPFWPF de la pantalla están respaldados en última instancia por un HWND.All WPFWPF elements on the screen are ultimately backed by a HWND. Cuando creas un WPFWPF Window, WPFWPF crea un HWND de nivel superior y usa un HwndSource para colocar el Window y su WPFWPF contenido dentro del HWND.When you create a WPFWPF Window, WPFWPF creates a top-level HWND, and uses an HwndSource to put the Window and its WPFWPF content inside the HWND. El resto del contenido de WPFWPF de la aplicación comparte ese HWND en concreto.The rest of your WPFWPF content in the application shares that singular HWND. Una excepción son los menús, los menús desplegables de cuadro combinado y otros elementos emergentes.An exception is menus, combo box drop downs, and other pop-ups. Estos elementos crean su propia ventana de nivel superior, razón por la cual un menú de WPFWPF puede exceder el borde del HWND de ventana que lo contiene.These elements create their own top-level window, which is why a WPFWPF menu can potentially go past the edge of the window HWND that contains it. Cuando usas HwndHost para colocar un HWND dentro de WPFWPF, WPFWPF informa a Win32Win32 cómo colocar el nuevo HWND secundario con relación a la WPFWPF Window HWND.When you use HwndHost to put an HWND inside WPFWPF, WPFWPF informs Win32Win32 how to position the new child HWND relative to the WPFWPF Window HWND.

Un concepto relacionado con HWND es la transparencia dentro de cada HWND y entre cada uno de ellos.A related concept to HWND is transparency within and between each HWND. Esto también se describe en el tema Información general sobre áreas de la tecnología.This is also discussed in the topic Technology Regions Overview.

Hospedar contenido de WPF en una ventana de Microsoft Win32Hosting WPF Content in a Microsoft Win32 Window

La clave para hospedar un WPFWPF en un Win32Win32 ventana es la HwndSource clase.The key to hosting a WPFWPF on a Win32Win32 window is the HwndSource class. Esta clase encapsula el contenido de WPFWPF en una ventana de Win32Win32, de manera que el contenido de WPFWPF se puede incorporar en su interfaz de usuario (UI)user interface (UI) como una ventana secundaria.This class wraps the WPFWPF content in a Win32Win32 window, so that the WPFWPF content can be incorporated into your interfaz de usuario (UI)user interface (UI) as a child window. El siguiente enfoque combina Win32Win32 y WPFWPF en una única aplicación.The following approach combines the Win32Win32 and WPFWPF in a single application.

  1. Implemente su contenido de WPFWPF (el elemento raíz del contenido) como una clase administrada.Implement your WPFWPF content (the content root element) as a managed class. Normalmente, la clase hereda de una de las clases que pueden contener varios elementos secundarios o que se usan como un elemento raíz, como DockPanel o Page.Typically, the class inherits from one of the classes that can contain multiple child elements and/or used as a root element, such as DockPanel or Page. En los siguientes pasos se hace referencia a esta clase como "clase de contenido de WPFWPF", mientras que las instancias de la clase se denominan "objetos de contenido de WPFWPF".In subsequent steps, this class is referred to as the WPFWPF content class, and instances of the class are referred to as WPFWPF content objects.

  2. Implemente una aplicación Win32Win32 con C++/CLIC++/CLI.Implement a Win32Win32 application with C++/CLIC++/CLI. Si está empezando con una aplicación existente de C++C++ no administrada, normalmente puede habilitarla para llamar al código administrado cambiando la configuración del proyecto para incluir el indicador del compilador /clr (en este tema no se describe el ámbito completo de lo que podría necesitarse para admitir la compilación de /clr).If you are starting with an existing unmanaged C++C++ application, you can usually enable it to call managed code by changing your project settings to include the /clr compiler flag (the full scope of what might be necessary to support /clr compilation is not described in this topic).

  3. Establezca el modelo de subprocesos en Contenedor uniproceso (STA).Set the threading model to Single Threaded Apartment (STA). WPFWPF usa este modelo de subprocesamiento.uses this threading model.

  4. Controle la notificación WM_CREATE en el procedimiento de ventana.Handle the WM_CREATE notification in your window procedure.

  5. En el controlador (o en una función a la que llama el controlador), haga lo siguiente:Within the handler (or a function that the handler calls), do the following:

    1. Cree un nuevo HwndSource objeto con la ventana primaria HWND como su parent parámetro.Create a new HwndSource object with the parent window HWND as its parent parameter.

    2. Cree una instancia de su clase de contenido WPFWPF.Create an instance of your WPFWPF content class.

    3. Asigne una referencia a la WPFWPF objeto de contenido para el HwndSource objeto RootVisual propiedad.Assign a reference to the WPFWPF content object to the HwndSource object RootVisual property.

    4. El HwndSource objeto Handle propiedad contiene el identificador de ventana (HWND).The HwndSource object Handle property contains the window handle (HWND). Para obtener un HWND que se pueda usar en la parte de la aplicación no administrada, convierta Handle.ToPointer() en un HWND.To get an HWND that you can use in the unmanaged part of your application, cast Handle.ToPointer() to an HWND.

  6. Implemente una clase administrada que contenga un campo estático para contener una referencia al objeto de contenido de WPFWPF.Implement a managed class that contains a static field that holds a reference to your WPFWPF content object. Esta clase le permite obtener una referencia a la WPFWPF objeto de contenido de su Win32Win32 código, pero más importante impide que su HwndSource se recolecte de forma inadvertida.This class allows you to get a reference to the WPFWPF content object from your Win32Win32 code, but more importantly it prevents your HwndSource from being inadvertently garbage collected.

  7. Adjunte un identificador a uno o varios de los eventos del objeto de contenido de WPFWPF para recibir notificaciones del objeto de contenido WPFWPF.Receive notifications from the WPFWPF content object by attaching a handler to one or more of the WPFWPF content object events.

  8. Comuníquese con el objeto de contenido de WPFWPF mediante la referencia que almacenó en el campo estático para establecer propiedades, llamar a métodos, etc.Communicate with the WPFWPF content object by using the reference that you stored in the static field to set properties, call methods, etc.

Nota

Puede hacer una parte o toda la definición de clase de contenido de WPFWPF para el primer paso en XAMLXAML usando la clase parcial predeterminada de la clase de contenido. Para ello, debe crear un ensamblado independiente y hacer referencia a este.You can do some or all of the WPFWPF content class definition for Step One in XAMLXAML using the default partial class of the content class, if you produce a separate assembly and then reference it. Aunque se suelen incluir un Application objeto como parte de la compilación la XAMLXAML en un ensamblado, no acabará usando que Application como parte de la interoperación, usa solo uno o varias de las clases raíz para XAMLXAML archivos hace referenciados para la aplicación y hacer referencia a sus clases parciales.Although you typically include an Application object as part of compiling the XAMLXAML into an assembly, you do not end up using that Application as part of the interoperation, you just use one or more of the root classes for XAMLXAML files referred to by the application and reference their partial classes. El resto del procedimiento es muy similar al descrito anteriormente.The remainder of the procedure is essentially similar to that outlined above.

Cada uno de estos pasos se describen mediante código en el tema Tutorial: Hospedar contenido WPF en Win32.Each of these steps is illustrated through code in the topic Walkthrough: Hosting WPF Content in Win32.

Hospedar una ventana de Microsoft Win32 en WPFHosting a Microsoft Win32 Window in WPF

La clave para hospedar un Win32Win32 ventana dentro de otros WPFWPF está contenido el HwndHost clase.The key to hosting a Win32Win32 window within other WPFWPF content is the HwndHost class. Esta clase encapsula la ventana en un elemento de WPFWPF que se puede agregar a un árbol de elementos de WPFWPF.This class wraps the window in a WPFWPF element which can be added to a WPFWPF element tree. HwndHost también admite APIAPIs que permiten realizar tareas como procesar los mensajes para la ventana hospedada.HwndHost also supports APIAPIs that allow you to do such tasks as process messages for the hosted window. El procedimiento básico es el siguiente:The basic procedure is:

  1. Cree un árbol de elementos para una aplicación de WPFWPF (se puede efectuar mediante código o mediante marcado).Create an element tree for a WPFWPF application (can be through code or markup). Buscar un punto adecuado y permitido en el árbol de elementos donde el HwndHost implementación puede agregarse como un elemento secundario.Find an appropriate and permissible point in the element tree where the HwndHost implementation can be added as a child element. En el resto de estos pasos, este elemento se conoce como el "elemento de reserva".In the remainder of these steps, this element is referred to as the reserving element.

  2. Derivar de HwndHost para crear un objeto que contiene su Win32Win32 contenido.Derive from HwndHost to create an object that holds your Win32Win32 content.

  3. En esa clase de host, invalide el HwndHost método BuildWindowCore.In that host class, override the HwndHost method BuildWindowCore. Devuelva el HWND de la ventana hospedada.Return the HWND of the hosted window. Tal vez quiera encapsular los controles reales como una ventana secundaria de la ventana devuelta; el encapsulamiento de los controles en una ventana host es una manera sencilla que tiene el contenido de WPFWPF para recibir notificaciones de los controles.You might want to wrap the actual control(s) as a child window of the returned window; wrapping the controls in a host window provides a simple way for your WPFWPF content to receive notifications from the controls. Esta técnica ayuda a corregir algunos problemas de Win32Win32 relacionados con el control de los mensajes en el límite del control hospedado.This technique helps correct for some Win32Win32 issues regarding message handling at the hosted control boundary.

  4. Invalidar el HwndHost métodos DestroyWindowCore y WndProc.Override the HwndHost methods DestroyWindowCore and WndProc. Aquí, la intención es procesar una limpieza y quitar las referencias al contenido hospedado, sobre todo si creó referencias a objetos no administrados.The intention here is to process cleanup and remove references to the hosted content, particularly if you created references to unmanaged objects.

  5. En el archivo de código subyacente, cree una instancia del control que hospeda la clase y conviértalo en un elemento secundario del elemento de reserva.In your code-behind file, create an instance of the control hosting class and make it a child of the reserving element. Normalmente se usa un controlador de eventos como Loaded, o utilice el constructor de clase parcial.Typically you would use an event handler such as Loaded, or use the partial class constructor. pero también podría agregar el contenido de interoperación mediante un comportamiento en tiempo de ejecución.But you could also add the interoperation content through a runtime behavior.

  6. Procese los mensajes de la ventana seleccionada, como las notificaciones de control.Process selected window messages, such as control notifications. Existen dos enfoques.There are two approaches. Ambos proporcionan el mismo acceso a la secuencia de mensajes, por lo que su elección es más bien una cuestión de comodidad a la hora de programar.Both provide identical access to the message stream, so your choice is largely a matter of programming convenience.

    • Mensaje implemente procesamiento para todos los mensajes (no solo los mensajes de cierre) en la invalidación de la HwndHost método WndProc.Implement message processing for all messages (not just shutdown messages) in your override of the HwndHost method WndProc.

    • Tiene el hospedaje WPFWPF elemento procesar los mensajes administrando el MessageHook eventos.Have the hosting WPFWPF element process the messages by handling the MessageHook event. Este evento se genera para cada mensaje que se envía al procedimiento de ventana principal de la ventana hospedada.This event is raised for every message that is sent to the main window procedure of the hosted window.

    • No se puede procesar mensajes de ventanas que están fuera del proceso utilizando WndProc.You cannot process messages from windows that are out of process using WndProc.

  7. Comuníquese con la ventana hospedada usando una invocación de plataforma para llamar a la función SendMessage no administrada.Communicate with the hosted window by using platform invoke to call the unmanaged SendMessage function.

Si sigue estos pasos, creará una aplicación que funcionará con la entrada del ratón.Following these steps creates an application that works with mouse input. Puede agregar compatibilidad de tabulación a la ventana hospedada implementando la IKeyboardInputSink interfaz.You can add tabbing support for your hosted window by implementing the IKeyboardInputSink interface.

Cada uno de estos pasos se describen mediante código en el tema Tutorial: Hospedar un Control de Win32 en WPF.Each of these steps is illustrated through code in the topic Walkthrough: Hosting a Win32 Control in WPF.

HWND dentro de WPFHwnds Inside WPF

Puede pensar en HwndHost como un control especial.You can think of HwndHost as a special control. (Técnicamente, HwndHost es un FrameworkElement clase derivada, no un Control clase derivada, pero puede considerarse un control a efectos de interoperación.) HwndHost abstrae subyacente Win32Win32 naturaleza del contenido hospedado tal que el resto de WPFWPF considera que el contenido hospedado como otro objeto de tipo control, que debe representar y procesar la entrada.(Technically, HwndHost is a FrameworkElement derived class, not a Control derived class, but it can be considered a control for purposes of interoperation.) HwndHost abstracts the underlying Win32Win32 nature of the hosted content such that the remainder of WPFWPF considers the hosted content to be another control-like object, which should render and process input. HwndHost por lo general se comporta como cualquier otro WPFWPF FrameworkElement, aunque hay algunas diferencias importantes en torno a la salida (dibujos y gráficos) y puede admitir la entrada (ratón y teclado) en función de las limitaciones de los HWND subyacentes.HwndHost generally behaves like any other WPFWPF FrameworkElement, although there are some important differences around output (drawing and graphics) and input (mouse and keyboard) based on limitations of what the underlying HWNDs can support.

Diferencias notables en el comportamiento de salidaNotable Differences in Output Behavior

  • FrameworkElement, que es el HwndHost clase base, tiene varias propiedades que implican cambios en la interfaz de usuario.FrameworkElement, which is the HwndHost base class, has quite a few properties that imply changes to the UI. Estos incluyen propiedades como FrameworkElement.FlowDirection, que cambia el diseño de elementos dentro de ese elemento como elemento primario.These include properties such as FrameworkElement.FlowDirection, which changes the layout of elements within that element as a parent. Pero la mayoría de estas propiedades no están asignadas a posibles equivalentes de Win32Win32, aunque dichos equivalentes existieran.However, most of these properties are not mapped to possible Win32Win32 equivalents, even if such equivalents might exist. Demasiadas de estas propiedades y de sus significados son tan específicos de la tecnología de representación que las asignaciones no resultan prácticas.Too many of these properties and their meanings are too rendering-technology specific for mappings to be practical. Por lo tanto, establecer propiedades como FlowDirection en HwndHost no tiene ningún efecto.Therefore, setting properties such as FlowDirection on HwndHost has no effect.

  • HwndHost no puede ser a girar, escala, sesgados o en caso contrario afectada por una transformación.HwndHost cannot be rotated, scaled, skewed, or otherwise affected by a Transform.

  • HwndHost no admite la Opacity propiedad (combinación alfa).HwndHost does not support the Opacity property (alpha blending). Si el contenido dentro de la HwndHost realiza System.Drawing operaciones que incluyen información alfa, que sí misma no es una infracción, pero el HwndHost como un todo solo admite una opacidad de 1,0 (100%).If content inside the HwndHost performs System.Drawing operations that include alpha information, that is itself not a violation, but the HwndHost as a whole only supports Opacity = 1.0 (100%).

  • HwndHost aparecerá encima de otro WPFWPF elementos en la misma ventana de nivel superior.HwndHost will appear on top of other WPFWPF elements in the same top-level window. Sin embargo, un ToolTip o ContextMenu menú generado es una ventana de nivel superior independiente y, por lo tanto, se comportará correctamente con HwndHost.However, a ToolTip or ContextMenu generated menu is a separate top-level window, and so will behave correctly with HwndHost.

  • HwndHost no respeta la zona de recorte de su elemento primario UIElement.HwndHost does not respect the clipping region of its parent UIElement. Esto es potencialmente un problema si intenta colocar un HwndHost clase dentro de una región desplazable o Canvas.This is potentially an issue if you attempt to put an HwndHost class inside a scrolling region or Canvas.

Diferencias notables en el comportamiento de entradaNotable Differences in Input Behavior

  • En general, mientras que los dispositivos de entrada tienen el ámbito de la HwndHost hospedado Win32Win32 región, los eventos de entrada vayan directamente a Win32Win32.In general, while input devices are scoped within the HwndHost hosted Win32Win32 region, input events go directly to Win32Win32.

  • Mientras el mouse está sobre el HwndHost, la aplicación no recibe WPFWPF los eventos del mouse y el valor de la WPFWPF propiedad IsMouseOver será false.While the mouse is over the HwndHost, your application does not receive WPFWPF mouse events, and the value of the WPFWPF property IsMouseOver will be false.

  • Mientras el HwndHost tiene el foco de teclado, la aplicación no recibirá WPFWPF eventos de teclado y el valor de la WPFWPF propiedad IsKeyboardFocusWithin será false.While the HwndHost has keyboard focus, your application will not receive WPFWPF keyboard events and the value of the WPFWPF property IsKeyboardFocusWithin will be false.

  • Cuando el foco está en el HwndHost y los cambios realizados en otro control dentro de la HwndHost, la aplicación no recibirá la WPFWPF eventos GotFocus o LostFocus.When focus is within the HwndHost and changes to another control inside the HwndHost, your application will not receive the WPFWPF events GotFocus or LostFocus.

  • Relacionadas con eventos y propiedades de lápiz son análogos y no proporcionan información mientras el lápiz está sobre HwndHost.Related stylus properties and events are analogous, and do not report information while the stylus is over HwndHost.

Tabulación, teclas de acceso y aceleradoresTabbing, Mnemonics, and Accelerators

El IKeyboardInputSink y IKeyboardInputSite interfaces le permiten crear una experiencia perfecta de teclado para mixto WPFWPF y Win32Win32 aplicaciones:The IKeyboardInputSink and IKeyboardInputSite interfaces allow you to create a seamless keyboard experience for mixed WPFWPF and Win32Win32 applications:

  • Tabulación entre componentes de Win32Win32 y WPFWPFTabbing between Win32Win32 and WPFWPF components

  • Las teclas de acceso y los aceleradores que funcionan tanto si el foco está dentro de un componente de Win32 como si está dentro de un componente de WPF.Mnemonics and accelerators that work both when focus is within a Win32 component and when it is within a WPF component.

El HwndHost y HwndSource clases proporcionan implementaciones de IKeyboardInputSink, pero no pueden administrar todos los mensajes de entrada que desee para escenarios más avanzados.The HwndHost and HwndSource classes both provide implementations of IKeyboardInputSink, but they may not handle all the input messages that you want for more advanced scenarios. Invalide los métodos adecuados para obtener el comportamiento de teclado que quiera.Override the appropriate methods to get the keyboard behavior you want.

Las interfaces solo proporcionan compatibilidad para lo que ocurre en la transición entre las zonas de WPFWPF y Win32Win32.The interfaces only provide support for what happens on the transition between the WPFWPF and Win32Win32 regions. Dentro de la zona de Win32Win32, el comportamiento de la tabulación está totalmente controlado por la lógica implementada de Win32Win32 de la tabulación, en el caso de que la haya.Within the Win32Win32 region, tabbing behavior is entirely controlled by the Win32Win32 implemented logic for tabbing, if any.

Vea tambiénSee also