【发布时间】:2020-03-21 00:10:08
【问题描述】:
总结
在 Windows 10 中将显示器置于睡眠模式时,Windows 似乎执行了一些在屏幕打开时无法执行的任务。 这干扰了我们的软件,我们需要摆脱它。
完整故事
对于带有触摸屏的硬件设备,出于耐用性原因,我需要能够在不使用触摸屏时将其关闭。 Windows 有一条消息,您可以发送以将其关闭,SC_MONITORPOWER。进一步来说:
SendMessage(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
这很好用,但是当屏幕关闭时,Windows 显然有时会执行一些在屏幕打开时不会执行的任务。我们小心在这种情况下永远不要在屏幕上写任何东西(当屏幕关闭时会导致巨大的问题,实际上只是在 DOS 框中有一个闪烁的光标在屏幕关闭时使用了半个内核)。
我们的软件要求每 0.25 毫秒执行一次回调。我们已经关闭了 Windows 中的几乎所有任务、服务和其他一些东西,并且在屏幕打开的情况下,我可以运行我们的软件数天而不会错过任何回调。但是关闭屏幕我会打嗝。回调已经以尽可能高的优先级运行。
因此,当我们关闭所有服务和任务时,显然我们错过了一些东西。打嗝似乎有两个原因:
- 每 10-30 小时左右发生一次(不确定确切时间,似乎有所不同)。但它总是发生 5 次,其间正好有 5 分钟(最多几毫秒)(因此在 25 分钟内总共发生 5 次)。
- 除此之外,我们通常每 4 到 10 小时就会出现一次打嗝,但两次打嗝之间的时间似乎不是很固定,因此也可能有多种原因。
这里我有点不知所措,运行分析软件很容易干扰我们自己的软件,因此更难检测这些故障何时真正发生以及何时是由运行分析软件引起的。
有趣的是,在 Adobe Audition 中录制音频时,我也在完全不同的系统(不同的硬件、不同的操作系统版本)上看到了这种每 5 分钟 5 次的情况。在这种情况下,Audition 每隔 5 分钟就会丢失一段音频,而且我认为只有当显示器处于睡眠模式并且您没有远程登录时才会发生这种情况。
我们已经尝试使用 Nircmd 等直接监视器命令关闭触摸屏,但它不支持这些。我的猜测是 SC_MONITORPOWER 消息在 Windows 中触发了更多的东西,如果我们可以关闭它们,那将解决我们的问题。有什么想法吗?
系统 Intel i5-8700 6 核,Windows LTSB,除了我们自己的软件,没有安装任何额外的软件。
【问题讨论】:
标签: windows background task hiccup