【发布时间】:2022-06-14 19:52:37
【问题描述】:
我有一台非常烦人的 SONY 安卓电视。当没有通过 HDMI 的信号时,设备只是不想关闭。我还连接了一台迷你电脑,在大多数情况下,电视只是用作显示器。现在,当 PC 进入睡眠状态时,电视会保持屏幕亮起并显示消息 - 没有信号...
(是的,我知道我应该再买一台电视,但这不是一个选择)。
我决定采取一些措施,至少在电脑进入睡眠状态时关闭电视。
我的第一个想法是采用 DDC/CI 方式,但电视没有启用它的设置,并且对实际命令没有反应。
因此,由于它是一台安卓电视,我想到了通过 WiFi 通过 adb 连接并发送关机命令:
adb shell input keyevent KEYCODE_POWER
从命令行手动尝试 - 到目前为止一切顺利,电视接受命令并关闭。
但更难的部分来了,在 Windows 10 上,我(仅)能够通过以下方式检测用户存在:
User32.dll and GetLastInputInfo()
但这还不够,因为我可能会观看视频(vlc、chrome 等)。在这种情况下,没有用户输入,但系统会被视频播放器保持唤醒。所以我需要知道什么时候有什么东西阻止了 Windows 进入睡眠状态。
我搜索并找到了:
- 有些人想知道作为硬件的电视是打开还是关闭 - 我不需要这个!
- 查看监视器是否以 Windows 通过
Win32_DesktopMonitor和ManagementObject发送信号的方式打开/关闭,但访问属性字段会引发异常。我需要访问result[n].Properties["Availability"]。 - 有人建议挂接到系统电源更改通知。
在我的情况下,这不是一个好主意,因为当我的应用程序从操作系统接收到“进入睡眠”事件时,只有一点时间可以采取行动,而且我担心 adb 不会那么快地实际发送命令(连接、仔细检查、关闭)。 - 有人建议挂接到监控电源变化通知。
这实际上可能是一个好主意,但其他一些人也警告说这些通知不是 100% 可靠的。 (我暂时没有尝试过,但如果其他试验失败,可能会退回到这个。)
但后来我遇到了这个:
https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/display--sleep--and-hibernate-idle-timers
这表明确实存在“关闭显示计时器”。尽管我找不到任何如何访问它的示例。我也了解到,如果你真的想让 Windows 防止睡眠,你需要使用SetThreadExecutionState。好的,但是如何阅读这个?我实际上试图列出所有进程并搜索这些标志,但要么我找不到它们,要么它们根本不存在。
然后我遇到了一个命令行命令:powercfg /requests,它为我提供了我需要的信息,但这意味着字符串解析,更重要的是要在我想避免的管理员权限下运行应用程序。
所以我的问题:
- 有谁知道是否以及如何阅读“关闭显示计时器”(最好在 c# 中)? (我假设它被 SetThreadExecutionState 重置)
- 有谁知道如何以更友好的代码方式获得与 powercfg /requests 相同的信息,最好不需要管理员权限?
- 碰巧有人知道这是否可以纯粹在电视上解决 - 也许通过一个 android 应用程序?
如果你能通读,非常感谢,如果你能提供一些线索,那就更感谢了。
更新:
我发现 2) 可能是不可能的:Possible to find all Windows processes preventing automatic sleep, w/o admin rights?
【问题讨论】:
标签: c# windows android-tv