我正在使用PushFrame来确保我的窗口在执行其他代码之前完成绘图。我的应用程序有一些时间敏感的函数,需要在我继续执行代码之前更新窗口。
所以我正在使用msdn:http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx
中的示例哪个效果很好,但是,如果用户在此代码执行窗口时拖动我的窗口并且您只能使用ctrl-alt-del将其恢复。
有什么想法吗?
答案 0 :(得分:5)
应用程序似乎已冻结,因为在从用户代码调用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();
答案 1 :(得分:3)
不幸的是,我没有为您提供解决方案,但只能确认我们可以在我们的应用程序中(以及在50行示例程序中)重现这一点。 随意投票for this connect issue.