10

段階的に WPF に変換している WinForms アプリケーションがあります。この時点で、アプリケーションのメイン フォームは、WPF に組み込まれた垂直サイドバーを含むフォーム (WinForm) です。サイドバーは ElementHost コントロールでホストされます。

メイン フォームでは、KeyPreview を true に設定し、OnKeyDown() をオーバーライドして、アプリケーション全体のキーボード ショートカットを処理します。サイドバーにフォーカスがある場合、キーボード イベントは OnKeyDown に送信されません。

これを修正する正しい方法は何ですか?

4

1 に答える 1

8

はい、KeyPreview は ElementHost によって考慮されていないようです。回避策は次のとおりです。

ElementHost から派生させ、ProcessCmdKey をオーバーライドします。base.ProcessCmdKey の結果が「処理されていません」と表示された場合は、メイン フォームでなくてもメッセージを親に渡します。これにより、他の winforms コントロールが正しく動作するため、メイン フォームがメッセージを受け取ります。ここにサンプルがあります...

public class KeyPreviewEnabledElementHost : ElementHost
{
    public KeyPreviewEnabledElementHost()
    {
    }

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message m, System.Windows.Forms.Keys keyData)
    {
        bool processed = base.ProcessCmdKey(ref m, keyData);

        if (!processed)
        {
            SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
        }

        return processed;
    }
}
于 2011-05-04T19:17:40.933 に答える