/p 预览模式中的屏幕保护程序在desk.cpl 关闭后继续运行
Posted
技术标签:
【中文标题】/p 预览模式中的屏幕保护程序在desk.cpl 关闭后继续运行【英文标题】:Screensaver in /p preview mode keeps running after desk.cpl is closed 【发布时间】:2014-02-23 11:43:37 【问题描述】:上下文:
我正在使用 C# 在 Windows 8.1 上使用 VS2010 .NET 4.0 开发屏幕保护程序。它非常“忙”,在初始加载时访问数据库并在显示到多显示器之前进行一些图像处理。
问题:
在大多数情况下,进程会干净地关闭 a) 在 /s 模式下移动鼠标/键盘或在 /p 模式下关闭desk.cpl 时。当我在 /p 模式下运行(desk.cpl 打开)然后我启动“设置”(/c 模式)或“预览”(/s 模式)时,会出现一个问题。关闭这些新进程后,/p 模式会按预期返回,但是当desk.cpl 关闭时/p 模式进程会继续运行。但是这是间歇性的 - 有时它会关闭,有时它不会不。
在/p 模式下,我明确不要在鼠标移动等时关闭表单,因为这不适合desk.cpl 预览窗口。因此,我的假设是desk.cpl 会杀死我的进程,但这似乎并没有持续发生。
问题:
如何确保 /p 模式持续关闭?
【问题讨论】:
这需要您开始使用调试器来找出仍在运行的代码。工具 + 附加到进程、调试 + 全部中断、调试 + Windows + 线程。 感谢@Hans-Passant。我应该在我的原始问题中提到我已经用调试器检查过。我发现正常处理仍在继续,但由于预览窗口消失了,当然没有显示屏幕更新。正常处理由每 8 秒触发一次的 system.timer 组成。这会调用表单方法(在预览的情况下只有一个),从文件中获取图像,对其进行一些处理,然后更新表单背景。 好吧,如果你不能通过它,就像他们说的那样绕过它。通过定期使用 GetParent 查看父窗口是否已更改,我已设法使该过程始终关闭。当它不再等于最初传递给屏幕保护程序的预览窗口句柄时,desk.cpl 屏幕保护程序面板必须消失。发生这种情况时,关闭该进程是安全的。我仍然想知道为什么desk.cpl 不会始终关闭该进程。我担心这里可能有些东西不整洁。 【参考方案1】:两种方法。您可以监视 WM_DESTROY 的消息泵并关闭它,或者您可以设置计时器和监视器以查看是否有可见窗口。请注意,当控制面板取代您(自行关闭,或用户选择新的屏幕保护程序)时,您的窗口将被隐藏,并且我相信已被破坏。由于您是屏幕保护程序,因此提前中止的风险似乎比永远挂着要小。
所以设置一个非表单计时器(如果您的窗口被破坏,表单计时器可能会被破坏),并定期检查自己。正如有人在 cmets 中针对您的问题指出的那样,您还可以监控 GetParent,看看它是否发生了变化。
【讨论】:
以上是关于/p 预览模式中的屏幕保护程序在desk.cpl 关闭后继续运行的主要内容,如果未能解决你的问题,请参考以下文章
横向模式下的预览方向使用 Camera2 api 顺时针旋转