获取当前的笔记本电脑盖状

我正在写一个C#应用程序(专门用于笔记本电脑),我想知道盖子的状态,即何时打开以及何时关闭。

我已经在这个SO答案的帮助下使用了pInvoke和Microsoft的RegisterPowerSettingNotification函数 。

所以,有了上面我知道盖子关闭或打开时知道它的状态,但我想在其他任何事情继续之前得到盖子的状态。 我注意到即使盖子没有变化,也会调用回调函数,我可以检查它的参数以了解盖子的状态,但这对我来说不好,因为它是一个事件,我不能简单地等待为了它发生(也许有另一种方法来解决这个问题?)。

我也尝试过PowerEnumeratefunction但是无法从中得到一些东西(可能有一些我不知道的东西可以提供帮助)

编辑1:我不能等待或延迟应用程序,并且有2个问题要求我获得没有CB的状态,第一个是在笔记本电脑连接到显示器时可以关闭盖子从而允许用户使用笔记本电脑。 如果用户在这种情况下启动应用程序,则无法启动。 第二个原因是我希望应用程序对用户友好并通知启动或停止时会发生什么,如果我在错误的时间得到cb,可能会被忽略,因为应用程序的内部逻辑,然后将不得不等到下一次我得到一个cb,我一点都没有。

所以,(没有双关语意)有没有办法立即得到这些信息?

编辑2:从评论看来,我不清楚我需要什么。 我需要一种方法来查询盖子的状态。 即 – 调用一些API或其他东西,返回值是状态。 谢谢!

关键字:GUID_LIDSWITCH_STATE_CHANGE,WM_POWERBROADCAST,电源设置

我不认为’盖子状态’可以保证反映在电源管理属性中。 您对盖子状态的兴趣仅仅是监视器吗? 如果是这样,您可以找到一种方法来确定集成屏幕的属性(如果在连接到外部监视器时安装它可能会出现问题)并保存它们。 然后检查正在使用的屏幕的属性并采取相应措施。

请参阅System.Windows.Forms.Screen – http://msdn.microsoft.com/en-us/library/system.windows.forms.screen%28v=vs.110%29.aspx

可以从HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY的“设备参数”键中提取序列号。 如何提取它(以及其他信息)在这里演示:

http://sourceforge.net/p/wmimonitor/code/HEAD/tree/DisplayInfoWMIProvider/WMIProvider/WMIProvider.cs

或者,假设即使Windows中的盖子关闭事件设置为“无任何”,回调仍然会触发,您可能会考虑帮助程序或服务一直运行并跟踪更改。 您可以通过注册表或文件共享状态。 您还可以查看是否有任何其他硬件项(例如触摸板)在关闭时更改电源状态而不管“电源计划”并使用GetDevicePowerState API函数。

因此,经过@Llwyd回答的长时间搜索后,我找到了一个解决方案。 我注意到当盖子关闭时,设备将从设备管理器中移除,因此解决方案是检查它是否存在。 它背后的代码有点大,所以我不会,但需要以下内容:1)使用WmiMonitorConnectionParamsVideoOutputTechnology和状态( DISPLAY_DEVICE_ATTACHED和/或DISPLAY_DEVICE_ACTIVE )识别内部屏幕的名称\ ID 2)一旦我知道设备的名称/ ID我可以通过枚举System.Windows.Forms.Screen.AllScreens(或保存DISPLAY_DEVICE_ATTACHED中的值)轻松查找它