Windows フォームと WPF の相互運用性入力アーキテクチャWindows Forms and WPF Interoperability Input Architecture

間の相互運用、WPFWPFWindows フォームWindows Forms両方のテクノロジは、適切なキーボード入力の処理である必要があります。Interoperation between the WPFWPF and Windows フォーム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 のキーボードとメッセージの処理WindowsFormsHost Keyboard and Message Processing

  • ElementHost のキーボードとメッセージの処理ElementHost Keyboard and Message Processing

モードレス フォームとダイアログ ボックスModeless Forms and Dialog Boxes

呼び出す、EnableWindowsFormsInteropメソッドをWindowsFormsHostからモードレス フォームまたはダイアログ ボックスを開き、要素、 WPFWPF-ベースのアプリケーション。Call the EnableWindowsFormsInterop method on the WindowsFormsHost element to open a modeless form or dialog box from a WPFWPF-based application.

呼び出す、EnableModelessKeyboardInteropメソッドをElementHostコントロールを開く、モードレスWPFWPFページで、 Windows フォームWindows Forms-ベースのアプリケーション。Call the EnableModelessKeyboardInterop method on the ElementHost control to open a modeless WPFWPF page in a Windows フォームWindows Forms-based application.

WindowsFormsHost のキーボードとメッセージの処理WindowsFormsHost Keyboard and Message Processing

によってホストされている場合、 WPFWPF-ベースのアプリケーション、Windows フォームWindows Formsキーボードとメッセージの処理は、以下で構成します。When hosted by a WPFWPF-based application, Windows フォームWindows Forms keyboard and message processing consists of the following:

  • WindowsFormsHostクラスからのメッセージの取得、WPFWPFによって実装されるメッセージ ループ、ComponentDispatcherクラス。The WindowsFormsHost class acquires messages from the WPFWPF message loop, which is implemented by the ComponentDispatcher class.

  • WindowsFormsHostクラス作成のためのサロゲートWindows フォームWindows Forms通常そのことを確認するメッセージ ループWindows フォームWindows Formsキーボード処理が行われます。The WindowsFormsHost class creates a surrogate Windows フォームWindows Forms message loop to ensure that ordinary Windows フォームWindows Forms keyboard processing occurs.

  • WindowsFormsHostクラスが実装する、IKeyboardInputSinkとフォーカス管理を調整するためのインターフェイスWPFWPFします。The WindowsFormsHost class implements the IKeyboardInputSink interface to coordinate focus management with WPFWPF.

  • WindowsFormsHostコントロールが自身を登録し、メッセージ ループを開始します。The WindowsFormsHost controls register themselves and start their message loops.

次のセクションでは、プロセスの詳細のこれらの部分について説明します。The following sections describe these parts of the process in more detail.

WPF のメッセージ ループからのメッセージを取得します。Acquiring Messages from the WPF Message Loop

ComponentDispatcherクラスのメッセージ ループ マネージャーWPFWPFします。The ComponentDispatcher class implements the message loop manager for WPFWPF. ComponentDispatcherクラスの外部クライアントにする前にメッセージをフィルター処理を有効にするフックを提供WPFWPFその処理を行います。The ComponentDispatcher class provides hooks to enable external clients to filter messages before WPFWPF processes them.

相互運用の実装のハンドル、ComponentDispatcher.ThreadFilterMessageこれにより、イベントWindows フォームWindows Formsする前にメッセージを処理するコントロールWPFWPFコントロール。The interoperation implementation handles the ComponentDispatcher.ThreadFilterMessage event, which enables Windows フォームWindows Forms controls to process messages before WPFWPF controls.

Windows フォームのメッセージ ループをサロゲートSurrogate Windows Forms Message Loop

既定で、System.Windows.Forms.Applicationクラスには、プライマリ メッセージ ループが含まれています。Windows フォームWindows Formsアプリケーション。By default, the System.Windows.Forms.Application class contains the primary message loop for Windows フォームWindows Forms applications. 相互運用性、中に、Windows フォームWindows Formsメッセージ ループは、メッセージを処理しません。During interoperation, the Windows フォームWindows Forms message loop does not process messages. そのため、このロジックを再現する必要があります。Therefore, this logic must be reproduced. ハンドラーは、ComponentDispatcher.ThreadFilterMessageイベントは、次の手順を実行します。The handler for the ComponentDispatcher.ThreadFilterMessage event performs the following steps:

  1. 使用してメッセージをフィルター処理、IMessageFilterインターフェイス。Filters the message using the IMessageFilter interface.

  2. 呼び出し、Control.PreProcessMessageメソッド。Calls the Control.PreProcessMessage method.

  3. 変換し、必要な場合に、メッセージをディスパッチします。Translates and dispatches the message, if it is required.

  4. その他のコントロールがメッセージを処理しない場合は、ホスト コントロールにメッセージを渡します。Passes the message to the hosting control, if no other controls process the message.

IKeyboardInputSink 実装IKeyboardInputSink Implementation

サロゲートのメッセージ ループは、キーボードの管理を処理します。The surrogate message loop handles keyboard management. そのため、IKeyboardInputSink.TabIntoメソッドは、唯一IKeyboardInputSinkの実装を必要とするメンバー、WindowsFormsHostクラス。Therefore, the IKeyboardInputSink.TabInto method is the only IKeyboardInputSink member that requires an implementation in the WindowsFormsHost class.

既定で、HwndHostクラスを返します。falseのそのIKeyboardInputSink.TabInto実装します。By default, the HwndHost class returns false for its IKeyboardInputSink.TabInto implementation. これにより、WPFWPFへの制御、Windows フォームWindows Formsコントロール。This prevents tabbing from a WPFWPF control to a Windows フォームWindows Forms control.

WindowsFormsHostの実装、IKeyboardInputSink.TabIntoメソッドは、次の手順を実行します。The WindowsFormsHost implementation of the IKeyboardInputSink.TabInto method performs the following steps:

  1. 最初の検索または最後Windows フォームWindows Formsに格納されているコントロール、WindowsFormsHostとコントロールがフォーカスを受け取ることができます。Finds the first or last Windows フォームWindows Forms control that is contained by the WindowsFormsHost control and that can receive focus. コントロールの選択肢は、トラバーサルの情報に依存します。The control choice depends on traversal information.

  2. コントロールにフォーカスを設定し、返しますtrueします。Sets focus to the control and returns true.

  3. コントロールがフォーカスを受け取ることはありません、返しますfalseします。If no control can receive focus, returns false.

WindowsFormsHost の登録WindowsFormsHost Registration

ウィンドウを処理するときに、WindowsFormsHostコントロールが作成された、WindowsFormsHostコントロールは、メッセージ ループの存在を登録する内部の静的メソッドを呼び出します。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.

登録時に、WindowsFormsHostコントロールは、メッセージ ループを調べます。During registration, the WindowsFormsHost control examines the message loop. メッセージ ループが開始されていない場合、ComponentDispatcher.ThreadFilterMessageイベント ハンドラーを作成します。If the message loop has not been started, the ComponentDispatcher.ThreadFilterMessage event handler is created. メッセージ ループを実行すると見なされます、ComponentDispatcher.ThreadFilterMessageイベント ハンドラーがアタッチされています。The message loop is considered to be running when the ComponentDispatcher.ThreadFilterMessage event handler is attached.

ウィンドウ ハンドルが破棄されるときに、WindowsFormsHostコントロールは登録から削除します。When the window handle is destroyed, the WindowsFormsHost control removes itself from registration.

ElementHost のキーボードとメッセージの処理ElementHost Keyboard and Message Processing

によってホストされている場合、Windows フォームWindows Formsアプリケーション、WPFWPFキーボードとメッセージの処理は、以下で構成します。When hosted by a Windows フォームWindows Forms application, WPFWPF keyboard and message processing consists of the following:

次に、これらの部分で詳しく説明します。The following sections describe these parts in more detail.

インターフェイスの実装Interface Implementations

Windows フォームWindows Forms、フォーカスのあるコントロールのウィンドウ ハンドルにキーボード メッセージをルーティングします。In Windows フォームWindows Forms, keyboard messages are routed to the window handle of the control that has focus. ElementHostコントロールでホストされている要素にこれらのメッセージがルーティングされます。In the ElementHost control, these messages are routed to the hosted element. これを実現する、ElementHostコントロールを提供するHwndSourceインスタンス。To accomplish this, the ElementHost control provides an HwndSource instance. 場合、ElementHostコントロールにフォーカスが、HwndSourceインスタンスにルーティングほとんどのキーボード入力を処理することができるように、 WPFWPF InputManagerクラス。If the ElementHost control has focus, the HwndSource instance routes most keyboard input so that it can be processed by the WPFWPF InputManager class.

HwndSourceクラスが実装する、IKeyboardInputSinkIKeyboardInputSiteインターフェイス。The HwndSource class implements the IKeyboardInputSink and IKeyboardInputSite interfaces.

キーボードの相互運用は、実装に依存しています、OnNoMoreTabStopsメソッド ハンドル TAB キーを矢印キーでホストされているすべての要素のフォーカスを移動する入力。Keyboard interoperation relies on implementing the OnNoMoreTabStops method to handle TAB key and arrow key input that moves focus out of hosted elements.

Tab キーと方向キーTabbing and Arrow Keys

Windows フォームWindows Forms選択ロジックにマップされて、IKeyboardInputSink.TabIntoOnNoMoreTabStops タブと矢印を実装するメソッドは、ナビゲーションをキーします。The Windows フォームWindows Forms selection logic is mapped to the IKeyboardInputSink.TabInto and OnNoMoreTabStops methods to implement TAB and arrow key navigation. オーバーライドする、Selectメソッドは、このマッピングを実現します。Overriding the Select method accomplishes this mapping.

コマンド キーとダイアログ ボックスのキーCommand Keys and Dialog Box Keys

付与するWPFWPFコマンド キーとダイアログ キーを処理する最初のチャンスWindows フォームWindows Formsに接続されているコマンドの前処理、TranslateAcceleratorメソッド。To give WPFWPF the first opportunity to process command keys and dialog keys, Windows フォームWindows Forms command preprocessing is connected to the TranslateAccelerator method. オーバーライドする、Control.ProcessCmdKeyメソッドは、2 つのテクノロジを接続します。Overriding the Control.ProcessCmdKey method connects the two technologies.

TranslateAcceleratorメソッドでは、ホスト型の要素は、WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、タブ、ENTER、esc キー、および矢印キーなどのコマンド キーを含む WM_SYSKEYUP など、すべてのキー メッセージを処理できます。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. 送信する重要なメッセージが処理されない場合、Windows フォームWindows Forms処理の先祖の階層。If a key message is not handled, it is sent up the Windows フォームWindows Forms ancestor hierarchy for handling.

アクセラレータの処理Accelerator Processing

アクセラレータを正しく処理するWindows フォームWindows Formsアクセラレータ処理に接続する必要があります、 WPFWPF AccessKeyManagerクラス。To process accelerators correctly, Windows フォームWindows Forms accelerator processing must be connected to the WPFWPF AccessKeyManager class. さらに、ホストされている要素にすべての WM_CHAR メッセージを正しくルーティングする必要があります。Additionally, all WM_CHAR messages must be correctly routed to hosted elements.

既定HwndSourceの実装、TranslateCharメソッドを返します。 false、WM_CHAR メッセージは、次のロジックを使用して処理されます。Because the default HwndSource implementation of the TranslateChar method returns false, WM_CHAR messages are processed using the following logic:

  • Control.IsInputCharメソッドをオーバーライドして、ホストされている要素をすべての WM_CHAR メッセージが転送されることを確認します。The Control.IsInputChar method is overridden to ensure that all WM_CHAR messages are forwarded to hosted elements.

  • ALT キーが押された場合、メッセージは WM_SYSCHAR です。If the ALT key is pressed, the message is WM_SYSCHAR. Windows フォームWindows Forms 使用してこのメッセージを前処理せず、IsInputCharメソッド。does not preprocess this message through the IsInputChar method. そのため、ProcessMnemonicメソッドをオーバーライドするクエリ、 WPFWPF AccessKeyManager登録済みのアクセラレータの。Therefore, the ProcessMnemonic method is overridden to query the WPFWPF AccessKeyManager for a registered accelerator. 登録済みのアクセラレータが見つかった場合AccessKeyManagerはそれを処理します。If a registered accelerator is found, AccessKeyManager processes it.

  • ALT キーが押されていない場合、 WPFWPF InputManagerクラスは、未処理の入力を処理します。If the ALT key is not pressed, the WPFWPF InputManager class processes the unhandled input. 入力が、アクセラレータの場合、AccessKeyManagerはそれを処理します。If the input is an accelerator, the AccessKeyManager processes it. PostProcessInputイベントが処理されなかった WM_CHAR メッセージを処理します。The PostProcessInput event is handled for WM_CHAR messages that were not processed.

ユーザーは、ALT キーを押すと、アクセラレータの視覚的な手掛かりがフォーム全体に表示されます。When the user presses the ALT key, accelerator visual cues are shown on the whole form. この動作をサポートするためにすべてElementHostアクティブなフォーム上のコントロールがコントロールにフォーカスがある、WM_SYSKEYDOWN のメッセージを受信します。To support this behavior, all ElementHost controls on the active form receive WM_SYSKEYDOWN messages, regardless of which control has focus.

メッセージの送信にのみElementHostアクティブ フォーム内のコントロール。Messages are sent only to ElementHost controls in the active form.

関連項目See also