我们有一个应用程序在主线程中做繁重的工作。为了防止Windows在繁重的工作中认为它“无响应”并启动重影功能(如本link中的“挂起 - 操作系统透视”部分所述),我们可以使用DisableProcessWindowsGhosting来转向关闭重影功能。
但是我们不希望在剩下的会话中将其关闭,我们希望在繁重的工作完成后重新开启。不幸的是,Windows没有为此提供任何(记录的)API。
是否有任何(可能是hacky)方式将其重新打开?
有趣的是,当应用程序在VC调试器中运行时,重影功能会被关闭,但是一旦它被分离,它就会重新启动。调试器必须有一些东西,任何想法?
答案 0 :(得分:1)
不管在 UI 线程上做繁重的工作本身就是错误的(繁重的工作应该在一个单独的线程上完成,该线程可选择将其进度传达给 UI),以下建议仅用于回答问题,支持评论中提到的遗留代码场景。
DisableProcessWindowsGhosting
是一条单向路,在进程的生命周期内禁用重影功能,因此唯一重新启用的条件是重新启动整个进程。
否则,所有正在调试的应用程序(不仅在 VC 调试器中,而且在任何调试器中)也免于重影。如果您想破解这种情况,您可以制作一个配套应用程序,它会在繁重的工作期间作为调试器 (DebugActiveProcess
) 附加到您的应用程序,并自行分离 (DebugSetProcessKillOnExit(FALSE)
+DebugActiveProcessStop
) 完成后。这会降低性能,并可能导致提升、分叉和 SEH 等问题。
最小化的窗口也应该免于重影,但我自己没有测试过这个。