はい、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;
}
}