当从隐藏变为可见时,如何阻止窗口短暂地重新出现在其最后一个可见位置?

Posted

技术标签:

【中文标题】当从隐藏变为可见时,如何阻止窗口短暂地重新出现在其最后一个可见位置?【英文标题】:How can I stop a window from briefly reappearing at its last visible position when going from hidden to visible? 【发布时间】:2012-03-02 12:30:46 【问题描述】:

我有一个显示视频的非全屏 DirectX 窗口,出于应用程序的目的,我需要四处移动,有时以编程方式从隐藏/可见更改。 当从隐藏变为可见时,有时可能需要将窗口移动到新位置才能显示。

我用ShowWindow(hWnd, SW_HIDE) 隐藏了窗口。 当我想再次在新位置显示窗口时,我首先使用SetWindowPos 使用新坐标和SWP_NOREDRAWSWP_NOZORDER 标志移动它(我不想弄乱Z 顺序)。

然后我调用ShowWindow(hWnd, SW_SHOW) 让窗口出现在新位置。这可以正常工作,只是窗口在出现在新的正确位置之前短暂出现在最后一次可见的位置。

我尝试过使用替代品 MoveWindow(repaint-option 设置为 false)和 GetWindowPlacement 以及 SetWindowPlacement(带有适当的标志),但它们给出了相同的结果。

如何强制窗口从隐藏变为可见时出现在正确的位置?

【问题讨论】:

再努力一点? SetWindowPlacement 应该可以,我想。在最坏的情况下(不起作用),我建议在设置为可见之前将窗口移出屏幕,然后将其移到屏幕上。 您真的看到的是视频叠加层而不是窗口框架吗? @Cheersandhth.-Alf:我尝试过将窗口移出屏幕,无论是否进入可见/隐藏,但它没有用。 HansPassant:不确定你的意思。我看到的是隐藏窗口之前可见的最后一个视频帧。窗口本身没有边框、控件或按钮等,只有视频。在这一点上,我最好的选择是它与 DirectX 相关,即 DirectX 如何处理显示/隐藏窗口。 @dwaffy:尝试在最小化之前将其移出屏幕。 @Cheersandhth.-Alf:试过了,没用。 【参考方案1】:

原来问题不是 Windows API 或 DirectX 的问题,而是解码器处理方式中的一个棘手错误。 窗口的放置及其可见性状态基于通过视频解码器传递的帧用户数据中的值。当解码器停止接收输入数据时,发生在与编码器的网络连接中断时,它也会停止为解码帧提供回调,数据仍在其“管道”中。当输入数据再次到达解码器时,它会吐出一些“卡住”的帧,其中包含不再有效的用户数据。

【讨论】:

以上是关于当从隐藏变为可见时,如何阻止窗口短暂地重新出现在其最后一个可见位置?的主要内容,如果未能解决你的问题,请参考以下文章

弹出窗口出现时如何阻止标签栏项目变灰

打开第二个窗口后隐藏主窗口?另外,当第二个窗口被用户关闭时,主窗口如何重新出现?

重新加载时阻止透明 UITableView 部分标题闪烁

OS X - 如何检测应用程序何时在登录时以隐藏状态启动?

如何检查我的窗口是不是隐藏/可见?

jQuery + CSS + IE 问题:页面加载时隐藏元素短暂出现