14

PushFrame を使用して、追加のコードを実行する前にウィンドウの描画が終了するようにしています。私のアプリケーションには、コードの実行を続行する前にウィンドウを更新する必要がある時間依存の機能がいくつかあります。

したがって、msdn のサンプルを使用しています: http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx

このコードが実行されたときにユーザーがウィンドウをドラッグしていて、ウィンドウがハングし、ctrl-alt-del でしか元に戻せない場合を除いて、これはうまく機能します。

何か案は?

4

2 に答える 2

6

ユーザー コードから が呼び出されたDragMove()後、ウィンドウのサイズ変更または操作からマウス キャプチャが自動的に解放されないため、アプリケーションがフリーズしているように見えます。Dispatcher.PushFrame()

回避策は、次の呼び出しの前に、マウスをキャプチャしているアプリケーション内の任意のウィンドウから手動でマウス キャプチャを解放することですDispatcher.PushFrame()

        ...
        if (priority < DispatcherPriority.Loaded)
        {
            IntPtr capturingHandle = GetCapture();
            for (int i = 0; i < Application.Current.Windows.Count; i++)
            {
                if (new WindowInteropHelper(
                                            Application.Current.Windows[i]
                                           ).Handle == capturingHandle)
                {
                    Mouse.Capture(
                                  Application.Current.Windows[i],
                                  CaptureMode.Element
                                 );
                    Application.Current.Windows[i].ReleaseMouseCapture();
                    break;
                }
            }
        }
        ...

この回避策では、GetCapture()p/invoke 宣言を利用します。

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetCapture();
于 2013-11-04T12:06:54.713 に答える
3

残念ながら、解決策はありませんが、アプリケーション (および 50 行のサンプル プログラム) でこれを再現できることを確認することしかできません。この接続の問題に自由に投票してください。

于 2013-10-31T19:43:08.827 に答える