gpt4 book ai didi

wpf - 调用 `Show()` 时任务栏上显示错误窗口

转载 作者:行者123 更新时间:2023-12-02 05:00:25 25 4
gpt4 key购买 nike

这让我感到困惑,我开始相信这是核心 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 , DeferWindowPosEndDeferWindowPos .

最后,当我使用 Visibility 显示/隐藏我的窗口时属性而不是使用 Show()Hide()所描述的行为在某些情况下也不会发生(稍后会详细介绍)。但是, according to the documentation on msdn :

Calling Show achieves the same end result as setting Visibility property of the Window object to Visible. However, there is a difference between the two from a timing perspective. Calling Show is a synchronous operation that returns only after the Loaded event on the child window has been raised [...]



这似乎与正在执行的操作密切相关 同步或异步 .在某些情况下,我使用 user32 的 ShowWindow 隐藏一个特定窗口.如果在我显示我的窗口(使用快捷键)之后立即再次出现问题,无论我是否使用 VisibilityShow()显示窗口。但是,如果我使用 ShowWindowAsync() 隐藏窗口,一切又好了。

最后......(这么多如果......我知道,对不起)当我在显示我的窗口之前点击任何窗口(选择它)时,问题也不会发生。如果我不使用快捷键来显示窗口,我永远不会发现这一点。

这个问题的根本原因可能是什么?

最佳答案

我想我已经确定了导致这种情况的核心问题。当窗口被隐藏时,另一个窗口被激活。但是,似乎只有任务栏上的窗口处于事件状态。当我隐藏所有窗口然后调用 GetActiveWindow 它表示没有窗口处于事件状态(返回值 null)。

当随后显示一个不应出现在任务栏上的窗口时(无论是使用 Show() 还是 Visibility),隐藏的窗口将显示在任务栏上。

解决此问题的解决方法是在延迟窗口定位操作后检查是否有任何窗口处于事件状态。如果没有,我现在将重点放在任务栏上。下次显示非任务栏窗口时,该错误不会出现!

succeeded = User32.EndDeferWindowPos( windowsPositionInfo );
if ( succeeded && User32.GetActiveWindow() == IntPtr.Zero )
{
WindowInfo startBar = GetWindows()
.Where( w => w.GetClassName() == "Shell_TrayWnd" ).FirstOrDefault();
if ( startBar != null )
{
User32.SwitchToThisWindow( startBar.Handle, false );
}
}

关于wpf - 调用 `Show()` 时任务栏上显示错误窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16835423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com