我正在写一个C#应用程序(专门用于笔记本电脑),我想知道盖子的状态,即何时打开以及何时关闭.
我已经在这个SO答案的帮助下使用了pInvoke和Microsoft的RegisterPowerSettingNotification函数.
因此,有了上述内容,我知道当盖子关闭或打开并知道其状态时,但我想在其他任何事情继续之前获得盖子的状态.我注意到即使盖子没有变化,也会调用回调函数,我可以检查它的参数以了解盖子的状态,但这对我来说不好,因为它是一个事件,我不能简单地等待为了它发生(也许有另一种方法来解决这个问题?).
我也尝试过PowerEnumerate功能,但无法从中得到一些东西(也许有一些我不知道的东西可以提供帮助)
编辑1:我不能等待或延迟应用程序,并且有2个问题要求我获得没有CB的状态,首先是在笔记本电脑连接到显示器时可以关闭盖子从而允许用户使用笔记本电脑.如果用户在这种情况下启动应用程序,则无法启动.第二个原因是我希望应用程序对用户友好并通知启动或停止时会发生什么,如果我在错误的时间得到cb,可能会被忽略,因为应用程序的内部逻辑,然后必须等到下一次我得到一个cb,我一点都没有.
那么,(没有双关语意)有没有办法立即得到这些信息?
编辑2:从评论看来,我不清楚我需要什么.我需要一种方法来查询盖子的状态.即 - 调用一些API或其他东西,返回值是状态.谢谢!
关键字:GUID_LIDSWITCH_STATE_CHANGE,WM_POWERBROADCAST,电源设置
因此,经过@Llwyd 答案的长时间搜索,我找到了解决方案。
我注意到,当盖子关闭时,该设备将从设备管理器中删除,因此解决方案是检查它是否存在。
它背后的代码有点庞大,所以我不会在这里上传,但需要以下内容:
WmiMonitorConnectionParams使用和VideoOutputTechnology和状态(DISPLAY_DEVICE_ATTACHED和/或)识别内部屏幕的名称\ID DISPLAY_DEVICE_ACTIVE。
一旦我知道了设备的名称/ID,我就可以通过枚举轻松查找它System.Windows.Forms.Screen.AllScreens(或保存来自 的值DISPLAY_DEVICE_ATTACHED)。