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