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