Winforms красть нажатия клавиш из компонента COM? - PullRequest
0 голосов
/ 21 октября 2010

У меня есть COM-компонент C ++ ATL, который отображает всплывающее окно (обычное Win32, используя стиль WS_POPUP), которое позволяет пользователю вводить некоторую информацию для поиска.Этот компонент был довольно тщательно протестирован с формой VB6 (прежде всего для простоты отладки), но мы хотим использовать его с WinNET-формами .NET.

Любопытная вещь, которую мы обнаружили при вызове компонента из среды 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 ест наши нажатия клавиш и как мы можем сказать, чтобы они прекратились?

1 Ответ

0 голосов
/ 21 октября 2010

Попробуйте подавить обработку Windows Forms сообщения WND (в элементе управления / форме, краже сообщения):

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONUP || m.Msg == WM_LBUTTONDBLCLK
       )
    {
        return;
    }
    base.WndProc(ref m);
}
...