有没有办法在DisableProcessWindowsGhosting之后重新打开Windows重影功能?

时间:2012-09-28 03:19:45

标签: windows winapi

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

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

是否有任何(可能是hacky)方式将其重新打开?

有趣的是,当应用程序在VC调试器中运行时,重影功能会被关闭,但是一旦它被分离,它就会重新启动。调试器必须有一些东西,任何想法?

1 个答案:

答案 0 :(得分:1)

不管在 UI 线程上做繁重的工作本身就是错误的(繁重的工作应该在一个单独的线程上完成,该线程可选择将其进度传达给 UI),以下建议仅用于回答问题,支持评论中提到的遗留代码场景。

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

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

最小化的窗口也应该免于重影,但我自己没有测试过这个。