WPF Winforms Interop есть нажатие клавиш

Я создаю проект winform с одной формой с 4 текстовыми полями и кнопкой.

По нажатию кнопки я выполняю следующее:

Window1 w = new Window1();
ElementHost.EnableModelessKeyboardInterop(w);
w.Show();

Где окно 1 является окном Wpf. Window1 имеет одну кнопку, и при нажатии этой кнопки происходит следующее:

System.Windows.MessageBox.Show("HelloWOrld");

Когда вы запускаете приложение, появляется форма WinForm. Если вы нажмете клавишу Tab, она циклически перебирает 4 текстовых поля без проблем. Затем нажмите кнопку, чтобы открыть окно WPF. Нажмите эту кнопку и откройте окно сообщения. Оставьте их открытыми, а затем вернитесь в форму WinForm, которую вы больше не можете перемещать по полям, но можете вводить другие символы. Похоже, что текстовые поля получают нажатия клавиш, но форма не получает их. Я также получаю системный звуковой сигнал, как будто модель получает нажатие клавиши.

РЕДАКТИРОВАТЬ 9/9/2014 15:44PM

Ганс ответил в комментариях и был прав. Я попытался описать более простой случай, который другим людям было бы легче воспроизвести и который использовал те же симптомы. Наша актуальная проблема заключается в том, что мы создали базовый класс окна, который поддерживает модальные и родительские возможности. Вот соответствующий код для нашего BaseWindow

public class BaseWindow: Window
{
    [DllImport("user32.dll")]
    static extern bool EnableWindow(IntPtr hWnd, bool bEnable);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

public void ShowModalToParent(Window frmParent, Action<bool?> callback = null)
{
    IntPtr myHandle = (new System.Windows.Interop.WindowInteropHelper(this)).Handle;
    EnableWindow(myHandle,         
    SetForegroundWindow(myHandle);
    this.Closing += Window_Closing;

    ShowInTaskbar = false;
    Owner = frmParent; // Keep on top of parent
    ClosedCallBack += callback ?? (p => { _modalDialogResult = p; });
    var parentHandle = (new System.Windows.Interop.WindowInteropHelper(frmParent)).Handle;
        EnableWindow(parentHandle, false); // Prevent events for parent
        new ShowAndWaitHelper(this).ShowAndWait();
}

internal class ShowAndWaitHelper
{
    private readonly Window _window;
    private DispatcherFrame _dispatcherFrame;
    internal ShowAndWaitHelper(Window window)
    {
        if (window == null)
        {
            throw new ArgumentNullException("panel");
        }
        this._window = window;
    }
    internal void ShowAndWait()
    {
        if (this._dispatcherFrame != null)
        {
            throw new InvalidOperationException("Cannot call ShowAndWait while waiting for a previous call to ShowAndWait to return.");
        }
        this._window.Closed += new EventHandler(this.OnPanelClosed);
        _window.Show();
        this._dispatcherFrame = new DispatcherFrame();
        Dispatcher.PushFrame(this._dispatcherFrame);
    }

    private void OnPanelClosed(object source, EventArgs eventArgs)
    {
        if (this._dispatcherFrame == null)
        {
            return;
        }
        this._window.Closed -= new EventHandler(this.OnPanelClosed);
        this._dispatcherFrame.Continue = false;
        this._dispatcherFrame = null;
    }
}
}

Я уверен, что этот код был взят из некоторого сообщения в блоге / форуме, но я не могу найти ссылку на него в коде. Мы хотим сохранить модальный для родителя, но некоторые, как решить проблему с нечетным нажатием клавиши. Чтобы воспроизвести проблему, замените button_click в Window1, чтобы вызвать ShowModalToParent для окна, которое использует это в качестве базового класса.

0 ответов

Другие вопросы по тегам