Interoperation between the WPF and Windows Forms requires that both technologies have the appropriate keyboard input processing. This topic describes how these technologies implement keyboard and message processing to enable smooth interoperation in hybrid applications.
This topic contains the following subsections:
Modeless Forms and Dialog Boxes
WindowsFormsHost Keyboard and Message Processing
ElementHost Keyboard and Message Processing
Modeless Forms and Dialog Boxes
Call the EnableWindowsFormsInterop method on the WindowsFormsHost element to open a modeless form or dialog box from a WPF-based application.
Call the EnableModelessKeyboardInterop method on the ElementHost control to open a modeless WPF page in a Windows Forms-based application.
WindowsFormsHost Keyboard and Message Processing
When hosted by a WPF-based application, Windows Forms keyboard and message processing consists of the following:
The following sections describe these parts of the process in more detail.
Acquiring Messages from the Windows Presentation Foundation Message Loop
Surrogate Windows Forms Message Loop
IKeyboardInputSink Implementation
WindowsFormsHost Registration
ElementHost Keyboard and Message Processing
When hosted by a Windows Forms application, WPF keyboard and message processing consists of the following:
The following sections describe these parts in more detail.
Interface Implementations
In Windows Forms, keyboard messages are routed to the window handle of the control that has focus. In the ElementHost control, these messages are routed to the hosted element. To accomplish this, the ElementHost control provides an HwndSource instance. If the ElementHost control has focus, the HwndSource instance routes most keyboard input so that it can be processed by the WPF InputManager class.
The HwndSource class implements the IKeyboardInputSink and IKeyboardInputSite interfaces.
Keyboard interoperation relies on implementing the OnNoMoreTabStops method to handle TAB key and arrow key input that moves focus out of hosted elements.
Tabbing and Arrow Keys
Command Keys and Dialog Box Keys
To give WPF the first opportunity to process command keys and dialog keys, Windows Forms command preprocessing is connected to the TranslateAccelerator method. Overriding the Control..::.ProcessCmdKey method connects the two technologies.
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. If a key message is not handled, it is sent up the Windows Forms ancestor hierarchy for handling.
Accelerator Processing
To process accelerators correctly, Windows Forms accelerator processing must be connected to the WPF AccessKeyManager class. Additionally, all WM_CHAR messages must be correctly routed to hosted elements.
Because the default HwndSource implementation of the TranslateChar method returns false, WM_CHAR messages are processed using the following logic:
The Control..::.IsInputChar method is overridden to ensure that all WM_CHAR messages are forwarded to hosted elements.
If the ALT key is pressed, the message is WM_SYSCHAR. Windows Forms does not preprocess this message through the IsInputChar method. Therefore, the ProcessMnemonic method is overridden to query the WPF AccessKeyManager for a registered accelerator. If a registered accelerator is found, AccessKeyManager processes it.
If the ALT key is not pressed, the WPF InputManager class processes the unhandled input. If the input is an accelerator, the AccessKeyManager processes it. The PostProcessInput event is handled for WM_CHAR messages that were not processed.
When the user presses the ALT key, accelerator visual cues are shown on the whole form. To support this behavior, all ElementHost controls on the active form receive WM_SYSKEYDOWN messages, regardless of which control has focus.
Messages are sent only to ElementHost controls in the active form.
Concepts
Reference