这一个让我感到困惑,我开始相信这是一个核心winapi,或可能在WPF中的错误。如果没有人知道这个问题的可能原因,我会在Microsoft Connect上提交错误报告。错误的窗口显示在任务栏上时,调用`显示()`
问题出现本身,一旦我呼叫Window.Show()
,但根本原因可能在于不同的地方,包括之前调用user32.dll。一旦我在窗口上调用Show()
,我的窗口显示出来,但另一个窗口在任务栏上弹出,但不可见。而且,点击它不会使该窗口可见。
我试图展示的窗口具有以下属性集,这似乎是造成这种奇怪行为所必需的。改变他们中的任何一个'修复'这个问题。
WindowStyle="None"
WindowState="Maximized"
ShowInTaskbar="False"
我正在创建一个虚拟桌面管理器(VDM),因此我通过user32.dll隐藏/显示窗口。如果我在显示我想要的窗口之前没有隐藏任何窗口,问题也不会出现。 VDM的全部代码is available on github。特定的user32调用发生在包装which can also be found on github中。
// Hide windows.
var hideWindows = _windows
.Select(w => new RepositionWindowInfo(w.Info) { Visible = false });
WindowManager.RepositionWindows(hideWindows.ToList());
的RepositionWindows
方法是有点长,张贴在这里,但你可以看到它in its entirety on github。它使用BeginDeferWindowPos
,DeferWindowPos
和EndDeferWindowPos
。
最后,当我使用Visibility
属性显示/隐藏我的窗口而不是使用Show()
和Hide()
时,所描述的行为在某些情况下(稍后更多)不会发生。然而,according to the documentation on msdn:
调用显示达到相同的最终结果设置能见度Window对象 属性可见。然而,从时间角度来看,这两者之间存在差异。调用显示的是,只有子窗口已经上调 Loaded事件后返回
这似乎是有很大关系的操作执行同步或异步 同步操作[...]。在某些情况下,我使用user32的ShowWindow
来隐藏一个特定窗口。如果在显示我的窗口(使用快捷键)后立即再次出现问题,无论是使用Visibility
还是Show()
来显示窗口。但是,如果我使用ShowWindowAsync()
来隐藏窗口,一切都会好起来的。当我在显示窗口之前点击任何窗口(选择它)时,问题也不会发生。最后...(很多if ...的...我知道,对不起)在显示我的窗口之前单击任何窗口(选择它)时,问题也不会发生。如果我不会使用快捷键来显示窗口,我将永远不会发现这个。
什么可能是这个问题的根源?
你写:“*这其中有我百思不得其解,我开始相信这是无论是在核心WINAPI,或可能在WPF中的错误*”评论没有进一步阅读:这是*非常*您不太可能在核心WINAPI中发现了一个真正的bug,其代码路径与窗口可见性一样常见......并且*极其不可能我的意思是基本上不可能。 –
@NikBougalis ...这就是为什么我在这里发布它。 ,p –