У меня есть COM-компонент C++ ATL, который отображает всплывающее окно (обычное Win32, с использованием стиля WS_POPUP), которое позволяет пользователю вводить некоторую информацию для поиска. Этот компонент был довольно тщательно протестирован на форме VB6 (в первую очередь для простоты отладки), но мы хотим использовать его с .NET winforms.
Любопытная вещь, которую мы обнаружили при вызове компонента из среды winforms, заключается в том, что определенные нажатия клавиш больше не доходят до нашего всплывающего окна. Например: мы создали подкласс окна редактирования во всплывающем окне, чтобы прослушивать клавишу ESC и закрывать всплывающее окно. В VB6 это прекрасно работает, но в winforms всплывающее окно никогда не получает событие keydown для ESC (это происходит для других клавиш, таких как стандартные буквенно-цифровые символы).
Использование компонента довольно тривиально, но я приведу здесь краткий пример, чтобы избежать любых вопросов:
public partial class Form1 : Form
{
CustomPopup panel;
public Form1()
{
panel = new CustomPopup(); //This is the COM object
}
private void button1_Click(object sender, EventArgs e)
{
Point p = this.PointToScreen(button1.Location);
// Display the popup, which gives focus to a child WC_EDIT field
panel.ShowPopupAt(p.X, p.Y);
}
}
Как видите, не так уж и много. Итак, какие идеи о том, что в winforms съедает наши нажатия клавиш и как мы можем остановить это?