13

我们有一个在主线程中做繁重工作的应用程序。为了防止 Windows在繁重的工作期间将其视为“无响应”并启动重影功能(如此链接中的“挂起 - 操作系统透视”部分所述),我们可以使用DisableProcessWindowsGhosting关闭重影功能。

但是我们不想在接下来的会话中关闭它,我们希望在完成繁重的工作后重新打开它。不幸的是,Windows 没有为此提供任何(记录在案的)API。

是否有任何(可能是hacky)方法可以重新打开它?

有趣的是,当应用程序在 VC 调试器中运行时,重影功能被关闭,但一旦它被分离,它就会重新打开。调试器一定有什么,知道吗?

4

1 回答 1

1

忽略这样一个事实,在 UI 线程上做繁重的工作本身就是错误的(繁重的工作应该在一个单独的线程上完成,可以选择将其进度传达给 UI),下面的建议只是为了回答这个问题,支持注释中提到的遗留代码场景。

DisableProcessWindowsGhosting是一条单向路径,并且在进程的生命周期内禁用重影功能,因此唯一的重新启用条件是重新启动整个进程。

否则,所有正在调试的应用程序(不仅在 VC 调试器中,而且在任何调试器中)也免于重影。如果您想破解这种情况,您可以制作一个配套应用程序,它会DebugActiveProcess在繁重的工作期间作为调试器 ( ) 附加到您的应用程序,并在完成后自行分离 ( DebugSetProcessKillOnExit(FALSE)+ DebugActiveProcessStop)。这会降低性能,并可能导致提升、分叉和 SEH 等问题。

最小化的窗户也应该不会出现重影,但我自己还没有测试过这个。

于 2021-07-06T17:16:39.837 回答