双击繁忙的最小化最大化窗口的任务栏按钮会导致其恢复非最大化大小——为什么?

双击繁忙的最小化最大化窗口的任务栏按钮会导致其恢复非最大化大小——为什么?

我正在使用 WinDirStat 扫描我的 D: 驱动器,它的窗口有点慢且没有响应。我最小化了已经最大化的窗口。一段时间后,我想检查进度,我单击了 WinDirStat 的任务栏按钮。由于它无法立即响应,我发现自己快速单击按钮多次(可能变成双击)。最后窗口显示但自动恢复到非最大化大小。

看截图: 最大化窗口 最小化它并双击任务栏按钮(“CH”图标之前突出显示的“81%D:-WinDirStat”)使其变成: 非最大化窗口

其他应用程序(如 Firefox、Visual Studio 甚至 Word)在无响应时也会发生这种情况。经常出现 Firefox 未最大化的情况尤其令人烦恼。我在 Photoshop 中屏蔽了 2 个屏幕截图中的文件名,并在启动时多次单击其任务栏按钮。然后我清楚地看到它一开始是最大化的,下次就变成非最大化了。

当应用程序不忙时,它们不会出现问题。第一次单击最小化窗口的任务栏按钮会将其调出,如果是双击,则第二次单击将被忽略。窗口不会恢复其大小。

为什么忙碌窗口会神奇地变为非最大化?我该如何禁用此行为?

答案1

现在我想我已经找到了原因,但我不知道如何解决它。

对于最小化-最大化的窗口(无论是否响应),如果我右键单击任务栏按钮并选择两次“恢复”,窗口将首先变为非最小化,然后变为非最大化。这可能是问题中发生的情况。

如果我左键单击任务栏按钮,Explorer 会检查窗口的当前状态。如果窗口已最小化,则会向其发送“恢复”消息。如果窗口正在显示但在后台,则会将其显示出来。如果窗口已在前台,则会将其最小化。

当最小化窗口响应时,单击任务栏按钮会将其调出。如果我再次单击,Explorer 将注意到该窗口已在前台,并再次将其最小化。

但是,当窗口没有响应时,它将不会响应“恢复”消息,并停留在最小化状态。如果我单击任务栏按钮两次,则两个“恢复”消息将排队,因为 Explorer 始终将窗口视为最小化。当窗口最终恢复时,它开始处理等待的消息。第一个“恢复”将窗口调出,第二个将窗口恢复到非最大化状态。

根本问题是“最小化”和“最大化”应该是窗口的两个不相关的属性,但 Windows 将它们混淆并使用相同的“还原”(SW_RESTORE)来清除它们。

到目前为止,我还不知道有任何解决方案可以修复此行为。我尝试监视这些“恢复”(全局挂接 APIPostMessage并检查是否msg == WM_SYSCOMMAND),但没有成功。

相关内容