Да, кажется, что KeyPreview не учитывается ElementHost, вот обходной путь:
Получите из ElementHost и переопределите ProcessCmdKey, когда результат base.ProcessCmdKey говорит, что «не обработан», передайте сообщениеparent, даже если это не ваша основная форма, таким образом ваша основная форма получит ее, потому что другие элементы управления 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;
}
}