0

4 つのテキスト ボックスとボタンを持つ単一のフォームで winform プロジェクトを作成します。

ボタンをクリックすると、次のことを実行します。

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

ウィンドウ 1 は Wpf ウィンドウです。Window1 には 1 つのボタンがあり、そのボタンがクリックされると、次のことが起こります。

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

アプリケーションを実行すると、WinForm フォームがポップアップします。タブを押すと、4 つのテキストボックスを循環して問題ありません。ボタンをクリックして WPF ウィンドウを開きます。そのボタンをクリックして、メッセージボックスをポップアップします。それらを開いたままにし、WinForm フォームに戻ると、タブでフィールドを移動することはできなくなりますが、他の文字を入力することはできます。テキストボックスはキーストロークを取得するように見えますが、フォームはキーストロークを取得しません。モデルがキーストロークを取得したかのように、システムのビープ音も聞こえます。

編集 2014 年 9 月 9 日午後 3 時 44 分

ハンスはコメントで返信し、正しかった。私は、他の人が再現しやすく、同じ症状を示した、より単純なケースを説明しようとしました。実際の問題は、モーダルから親への機能をサポートするウィンドウ基本クラスを作成したことです。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;
    }
}
}

このコードは、何らかのブログ/フォーラムの投稿から取得したものだと確信していますが、コード内でそれへの参照を見つけることができません。モーダルを親に保持したいのですが、奇数のキー押下の問題に対処する方法があります。問題を再現するには、Window1 の button_click を置き換えて、これを基本クラスとして使用するウィンドウで ShowModalToParent を呼び出します。

4

0 に答える 0